Browse Source

Fix exception after changing polygon on widget

pull/5503/head
Swoq 5 years ago
committed by Andrew Shvayka
parent
commit
52d626882b
  1. 42
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/geo/GeoUtil.java

42
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;
}
}

Loading…
Cancel
Save