Commit 52d626882bc7fbfd3d9b85f2053163bbf53d625b

Authored by Swoq
Committed by Andrew Shvayka
1 parent 17f9eebe

Fix exception after changing polygon on widget

@@ -45,24 +45,42 @@ public class GeoUtil { @@ -45,24 +45,42 @@ public class GeoUtil {
45 } 45 }
46 46
47 public static synchronized boolean contains(String polygon, Coordinates coordinates) { 47 public static synchronized boolean contains(String polygon, Coordinates coordinates) {
48 - ShapeFactory.PolygonBuilder polygonBuilder = jtsCtx.getShapeFactory().polygon();  
49 JsonArray polygonArray = new JsonParser().parse(polygon).getAsJsonArray(); 48 JsonArray polygonArray = new JsonParser().parse(polygon).getAsJsonArray();
50 - boolean first = true; 49 +
  50 + JsonArray arrayWithCoords = polygonArray;
  51 + JsonArray innerArray = polygonArray.get(0).getAsJsonArray();
  52 + if (!containsPrimitives(innerArray)) {
  53 + arrayWithCoords = innerArray;
  54 + }
  55 +
  56 + Shape shape = buildPolygonFromJsonCoords(arrayWithCoords);
  57 + Point point = jtsCtx.getShapeFactory().pointXY(coordinates.getLongitude(), coordinates.getLatitude());
  58 + return shape.relate(point).equals(SpatialRelation.CONTAINS);
  59 + }
  60 +
  61 + private static Shape buildPolygonFromJsonCoords(JsonArray coordinates) {
  62 + ShapeFactory.PolygonBuilder polygonBuilder = jtsCtx.getShapeFactory().polygon();
  63 + boolean isFirst = true;
51 double firstLat = 0.0; 64 double firstLat = 0.0;
52 double firstLng = 0.0; 65 double firstLng = 0.0;
53 - for (JsonElement jsonElement : polygonArray) {  
54 - double lat = jsonElement.getAsJsonArray().get(0).getAsDouble();  
55 - double lng = jsonElement.getAsJsonArray().get(1).getAsDouble();  
56 - if (first) { 66 + for (JsonElement element : coordinates) {
  67 + double lat = element.getAsJsonArray().get(0).getAsDouble();
  68 + double lng = element.getAsJsonArray().get(1).getAsDouble();
  69 + if (isFirst) {
57 firstLat = lat; 70 firstLat = lat;
58 firstLng = lng; 71 firstLng = lng;
59 - first = false; 72 + isFirst = false;
60 } 73 }
61 - polygonBuilder.pointXY(jtsCtx.getShapeFactory().normX(lng), jtsCtx.getShapeFactory().normY(lat)); 74 + polygonBuilder.pointXY(jtsCtx.getShapeFactory().normX(lng), jtsCtx.getShapeFactory().normX(lat));
62 } 75 }
63 - polygonBuilder.pointXY(jtsCtx.getShapeFactory().normX(firstLng), jtsCtx.getShapeFactory().normY(firstLat));  
64 - Shape shape = polygonBuilder.buildOrRect();  
65 - Point point = jtsCtx.getShapeFactory().pointXY(coordinates.getLongitude(), coordinates.getLatitude());  
66 - return shape.relate(point).equals(SpatialRelation.CONTAINS); 76 + polygonBuilder.pointXY(jtsCtx.getShapeFactory().normX(firstLng), jtsCtx.getShapeFactory().normX(firstLat));
  77 + return polygonBuilder.buildOrRect();
  78 + }
  79 +
  80 + private static boolean containsPrimitives(JsonArray array) {
  81 + for (JsonElement element : array) {
  82 + return element.isJsonPrimitive();
  83 + }
  84 + return false;
67 } 85 }
68 } 86 }