Commit 52d626882bc7fbfd3d9b85f2053163bbf53d625b
Committed by
Andrew Shvayka
1 parent
17f9eebe
Fix exception after changing polygon on widget
Showing
1 changed file
with
30 additions
and
12 deletions
... | ... | @@ -45,24 +45,42 @@ public class GeoUtil { |
45 | 45 | } |
46 | 46 | |
47 | 47 | public static synchronized boolean contains(String polygon, Coordinates coordinates) { |
48 | - ShapeFactory.PolygonBuilder polygonBuilder = jtsCtx.getShapeFactory().polygon(); | |
49 | 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 | 64 | double firstLat = 0.0; |
52 | 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 | 70 | firstLat = lat; |
58 | 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 | } | ... | ... |