diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/geo/GeoUtil.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/geo/GeoUtil.java index b5612dfc6a..a67693749e 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/geo/GeoUtil.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/geo/GeoUtil.java @@ -45,24 +45,42 @@ public class GeoUtil { } public static synchronized boolean contains(String polygon, Coordinates coordinates) { - ShapeFactory.PolygonBuilder polygonBuilder = jtsCtx.getShapeFactory().polygon(); JsonArray polygonArray = new JsonParser().parse(polygon).getAsJsonArray(); - boolean first = true; + + JsonArray arrayWithCoords = polygonArray; + JsonArray innerArray = polygonArray.get(0).getAsJsonArray(); + if (!containsPrimitives(innerArray)) { + arrayWithCoords = innerArray; + } + + Shape shape = buildPolygonFromJsonCoords(arrayWithCoords); + Point point = jtsCtx.getShapeFactory().pointXY(coordinates.getLongitude(), coordinates.getLatitude()); + return shape.relate(point).equals(SpatialRelation.CONTAINS); + } + + private static Shape buildPolygonFromJsonCoords(JsonArray coordinates) { + ShapeFactory.PolygonBuilder polygonBuilder = jtsCtx.getShapeFactory().polygon(); + boolean isFirst = true; double firstLat = 0.0; double firstLng = 0.0; - for (JsonElement jsonElement : polygonArray) { - double lat = jsonElement.getAsJsonArray().get(0).getAsDouble(); - double lng = jsonElement.getAsJsonArray().get(1).getAsDouble(); - if (first) { + for (JsonElement element : coordinates) { + double lat = element.getAsJsonArray().get(0).getAsDouble(); + double lng = element.getAsJsonArray().get(1).getAsDouble(); + if (isFirst) { firstLat = lat; firstLng = lng; - first = false; + isFirst = false; } - polygonBuilder.pointXY(jtsCtx.getShapeFactory().normX(lng), jtsCtx.getShapeFactory().normY(lat)); + polygonBuilder.pointXY(jtsCtx.getShapeFactory().normX(lng), jtsCtx.getShapeFactory().normX(lat)); } - polygonBuilder.pointXY(jtsCtx.getShapeFactory().normX(firstLng), jtsCtx.getShapeFactory().normY(firstLat)); - Shape shape = polygonBuilder.buildOrRect(); - Point point = jtsCtx.getShapeFactory().pointXY(coordinates.getLongitude(), coordinates.getLatitude()); - return shape.relate(point).equals(SpatialRelation.CONTAINS); + polygonBuilder.pointXY(jtsCtx.getShapeFactory().normX(firstLng), jtsCtx.getShapeFactory().normX(firstLat)); + return polygonBuilder.buildOrRect(); + } + + private static boolean containsPrimitives(JsonArray array) { + for (JsonElement element : array) { + return element.isJsonPrimitive(); + } + return false; } }