Skip to content

Commit 623062d

Browse files
authored
Merge pull request #1 from djsdjs/patch-1
Update PolygonGeohashUDF.java
2 parents 4cb846f + 918fb04 commit 623062d

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

src/main/java/tech/leovan/hive/udf/geo/PolygonAreaUDF.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,14 @@ public Double evaluate(String polygonString, String polygonStringFormat) {
3939
return null;
4040
}
4141

42-
Geometry polygon = CTX.getShapeFactory().getGeometryFrom(shape);
43-
if (!(polygon instanceof Polygon || polygon instanceof MultiPolygon)) {
42+
Geometry geometry = CTX.getShapeFactory().getGeometryFrom(shape);
43+
if (!(geometry instanceof Polygon || geometry instanceof MultiPolygon)) {
4444
return null;
4545
}
4646

4747
try {
4848
MathTransform transform = CRS.findMathTransform(SOURCE_CRS, TARGET_CRS, false);
49-
Geometry geometryMercator = JTS.transform(polygon, transform);
49+
Geometry geometryMercator = JTS.transform(geometry, transform);
5050

5151
return geometryMercator.getArea();
5252
} catch (Exception e) {

src/main/java/tech/leovan/hive/udf/geo/PolygonGeohashUDF.java

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,26 @@ public List<String> evaluate(
4242
return null;
4343
}
4444

45-
Geometry polygon = CTX.getShapeFactory().getGeometryFrom(shape);
46-
if (!(polygon instanceof Polygon || polygon instanceof MultiPolygon)) {
45+
Geometry geometry = CTX.getShapeFactory().getGeometryFrom(shape);
46+
if (!(geometry instanceof Polygon || geometry instanceof MultiPolygon)) {
4747
return null;
4848
}
4949

50+
Set<String> geohashes = new HashSet<>();
51+
52+
if (geometry instanceof Polygon) {
53+
geohashes = getGeoHashes((Polygon) geometry, precision);
54+
} else {
55+
for (int i = 0; i < geometry.getNumGeometries(); i++){
56+
Geometry polygon = geometry.getGeometryN(i);
57+
geohashes.addAll(getGeoHashes((Polygon) polygon, precision));
58+
}
59+
}
60+
61+
return new ArrayList<>(geohashes);
62+
}
63+
64+
private Set<String> getGeoHashes(Polygon polygon, Integer precision){
5065
Point centroid = polygon.getCentroid();
5166

5267
Set<String> geohashes = new HashSet<>();
@@ -55,8 +70,7 @@ public List<String> evaluate(
5570

5671
while (!testingGeohashes.isEmpty()) {
5772
String geohash = testingGeohashes.poll();
58-
Geometry geohashGeometry = CTX.getShapeFactory().getGeometryFrom(
59-
GeohashUtils.decodeBoundary(geohash, CTX));
73+
Geometry geohashGeometry = CTX.getShapeFactory().getGeometryFrom(GeohashUtils.decodeBoundary(geohash, CTX));
6074

6175
if (polygon.contains(geohashGeometry) || polygon.intersects(geohashGeometry)) {
6276
geohashes.add(geohash);
@@ -72,7 +86,7 @@ public List<String> evaluate(
7286
}
7387
}
7488

75-
return new ArrayList<>(geohashes);
89+
return geohashes;
7690
}
7791

7892
public List<String> evaluate(

0 commit comments

Comments
 (0)