added methods for check if point in polygon to tbel
This commit is contained in:
		
							parent
							
								
									d4f7cb7df1
								
							
						
					
					
						commit
						e2fdc5a4ba
					
				@ -215,6 +215,7 @@ public class DefaultTbActorSystem implements TbActorSystem {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void stop() {
 | 
			
		||||
        actors.values().forEach(mailbox -> Optional.ofNullable(mailbox).ifPresent(m -> m.destroy(null)));
 | 
			
		||||
        dispatchers.values().forEach(dispatcher -> {
 | 
			
		||||
            dispatcher.getExecutor().shutdown();
 | 
			
		||||
            try {
 | 
			
		||||
@ -226,7 +227,6 @@ public class DefaultTbActorSystem implements TbActorSystem {
 | 
			
		||||
        if (scheduler != null) {
 | 
			
		||||
            scheduler.shutdownNow();
 | 
			
		||||
        }
 | 
			
		||||
        actors.values().forEach(mailbox -> Optional.ofNullable(mailbox).ifPresent(m -> m.destroy(null)));
 | 
			
		||||
        actors.clear();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -48,6 +48,10 @@
 | 
			
		||||
            <groupId>org.thingsboard.common</groupId>
 | 
			
		||||
            <artifactId>util</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.thingsboard.rule-engine</groupId>
 | 
			
		||||
            <artifactId>rule-engine-components</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.javadelight</groupId>
 | 
			
		||||
            <artifactId>delight-nashorn-sandbox</artifactId>
 | 
			
		||||
 | 
			
		||||
@ -15,6 +15,7 @@
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.script.api.tbel;
 | 
			
		||||
 | 
			
		||||
import com.fasterxml.jackson.databind.JsonNode;
 | 
			
		||||
import com.google.common.primitives.Bytes;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.apache.commons.lang3.ArrayUtils;
 | 
			
		||||
@ -23,6 +24,10 @@ import org.mvel2.ParserConfiguration;
 | 
			
		||||
import org.mvel2.execution.ExecutionArrayList;
 | 
			
		||||
import org.mvel2.execution.ExecutionHashMap;
 | 
			
		||||
import org.mvel2.util.MethodStub;
 | 
			
		||||
import org.thingsboard.common.util.JacksonUtil;
 | 
			
		||||
import org.thingsboard.rule.engine.geo.Coordinates;
 | 
			
		||||
import org.thingsboard.rule.engine.geo.GeoUtil;
 | 
			
		||||
import org.thingsboard.rule.engine.geo.RangeUnit;
 | 
			
		||||
import org.thingsboard.server.common.data.StringUtils;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
@ -371,6 +376,10 @@ public class TbUtils {
 | 
			
		||||
                byte[].class, int.class)));
 | 
			
		||||
        parserConfig.addImport("parseBinaryArrayToInt", new MethodStub(TbUtils.class.getMethod("parseBinaryArrayToInt",
 | 
			
		||||
                byte[].class, int.class, int.class)));
 | 
			
		||||
        parserConfig.addImport("isInsidePolygon", new MethodStub(TbUtils.class.getMethod("isInsidePolygon",
 | 
			
		||||
                double.class, double.class, String.class)));
 | 
			
		||||
        parserConfig.addImport("isInsideCircle", new MethodStub(TbUtils.class.getMethod("isInsideCircle",
 | 
			
		||||
                double.class, double.class, String.class)));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String btoa(String input) {
 | 
			
		||||
@ -1437,6 +1446,22 @@ public class TbUtils {
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean isInsidePolygon(double latitude, double longitude, String perimeter) {
 | 
			
		||||
        return GeoUtil.contains(perimeter, new Coordinates(latitude, longitude));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean isInsideCircle(double latitude, double longitude, String perimeter) {
 | 
			
		||||
        JsonNode perimeterJson = JacksonUtil.toJsonNode(perimeter);
 | 
			
		||||
        double centerLatitude = Double.parseDouble(perimeterJson.get("latitude").asText());
 | 
			
		||||
        double centerLongitude = Double.parseDouble(perimeterJson.get("longitude").asText());
 | 
			
		||||
        double range = Double.parseDouble(perimeterJson.get("radius").asText());
 | 
			
		||||
        RangeUnit rangeUnit = perimeterJson.has("radiusUnit") ? RangeUnit.valueOf(perimeterJson.get("radiusUnit").asText()) : RangeUnit.METER;
 | 
			
		||||
 | 
			
		||||
        Coordinates entityCoordinates = new Coordinates(latitude, longitude);
 | 
			
		||||
        Coordinates perimeterCoordinates = new Coordinates(centerLatitude, centerLongitude);
 | 
			
		||||
        return range > GeoUtil.distance(entityCoordinates, perimeterCoordinates, rangeUnit);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static byte isValidIntegerToByte(Integer val) {
 | 
			
		||||
        if (val > 255 || val < -128) {
 | 
			
		||||
            throw new NumberFormatException("The value '" + val + "' could not be correctly converted to a byte. " +
 | 
			
		||||
 | 
			
		||||
@ -1245,6 +1245,56 @@ const tbelEditorCompletions:TbEditorCompletions = {
 | 
			
		||||
      type: 'boolean'
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  isInsidePolygon: {
 | 
			
		||||
    meta: 'function',
 | 
			
		||||
    description: 'Checks if a given point is inside a polygon.',
 | 
			
		||||
    args: [
 | 
			
		||||
      {
 | 
			
		||||
        name: 'latitude',
 | 
			
		||||
        description: 'The latitude of the point',
 | 
			
		||||
        type: 'number'
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        name: 'longitude',
 | 
			
		||||
        description: 'The longitude of the point',
 | 
			
		||||
        type: 'number'
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        name: 'perimeter',
 | 
			
		||||
        description: 'The polygon perimeter represented as a string',
 | 
			
		||||
        type: 'string'
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    return: {
 | 
			
		||||
      description: 'True if the point is inside the polygon, false otherwise.',
 | 
			
		||||
      type: 'boolean'
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  isInsideCircle: {
 | 
			
		||||
    meta: 'function',
 | 
			
		||||
    description: 'Checks if a given point is inside a circular area.',
 | 
			
		||||
    args: [
 | 
			
		||||
      {
 | 
			
		||||
        name: 'latitude',
 | 
			
		||||
        description: 'The latitude of the point',
 | 
			
		||||
        type: 'number'
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        name: 'longitude',
 | 
			
		||||
        description: 'The longitude of the point',
 | 
			
		||||
        type: 'number'
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        name: 'perimeter',
 | 
			
		||||
        description: 'A string representation of the circle, containing center coordinates and radius',
 | 
			
		||||
        type: 'string'
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    return: {
 | 
			
		||||
      description: 'True if the point is inside the circle, false otherwise.',
 | 
			
		||||
      type: 'boolean'
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const tbelUtilsAutocompletes = new TbEditorCompleter(tbelEditorCompletions);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user