GeoMesa Utils¶
Useful utilities are found in the geomesa-utils
module.
Simple Feature Wrapper Generation¶
Tools can generate wrapper classes for simple feature types defined in TypeSafe Config files. Your config files should be under src/main/resources. Add the following snippet to your pom, specifying the package you would like the generated class to reside in:
<build>
...
<plugins>
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.3.2</version>
<executions>
<execution>
<id>generate-sft-wrappers</id>
<phase>generate-sources</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>org.locationtech.geomesa.utils.geotools.GenerateFeatureWrappers</mainClass>
<cleanupDaemonThreads>false</cleanupDaemonThreads>
<killAfter>-1</killAfter>
<arguments>
<argument>${project.basedir}</argument>
<argument>org.foo.mypackage</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Geohash¶
Geohashes are a geocoding system that uses a Z-order curve to hierarchically subdivide the latitude/longitude grid into progressively smaller bins. The length of a Geohash in bits indicates its precision.
For example, the table below shows Geohash bounding boxes around the point (-78.48, 38.03) with increasing levels of precision in units of bits (the coordinates are rounded to three decimal places for clarity):
bits |
bounding box |
centroid |
geohash |
---|---|---|---|
1 |
-180.000 -90.000, 0.000 90.000 |
-90.000 0.000 |
0 |
2 |
-180.000 0.000, 0.000 90.000 |
-90.000 45.000 |
01 |
3 |
-90.000 0.000, 0.000 90.000 |
-45.000 45.000 |
011 |
4 |
-90.000 0.000, 0.000 45.000 |
-45.000 22.500 |
0110 |
5 |
-90.000 0.000, -45.000 45.000 |
-67.500 22.500 |
01100 |
6 |
-90.000 22.500, -45.000 45.000 |
-67.500 33.750 |
011001 |
7 |
-90.000 22.500, -67.500 45.000 |
-78.750 33.750 |
0110010 |
8 |
-90.000 33.750, -67.500 45.000 |
-78.750 39.375 |
01100101 |
9 |
-78.750 33.750, -67.500 45.000 |
-73.125 39.375 |
011001011 |
10 |
-78.750 33.750, -67.500 39.375 |
-73.125 36.563 |
0110010110 |
11 |
-78.750 33.750, -73.125 39.375 |
-75.938 36.563 |
01100101100 |
12 |
-78.750 36.563, -73.125 39.375 |
-75.938 37.969 |
011001011001 |
13 |
-78.750 36.563, -75.938 39.375 |
-77.344 37.969 |
0110010110010 |
14 |
-78.750 37.969, -75.938 39.375 |
-77.344 38.672 |
01100101100101 |
15 |
-78.750 37.969, -77.344 39.375 |
-78.047 38.672 |
011001011001010 |
16 |
-78.750 37.969, -77.344 38.672 |
-78.047 38.320 |
0110010110010100 |
17 |
-78.750 37.969, -78.047 38.672 |
-78.398 38.320 |
01100101100101000 |
18 |
-78.750 37.969, -78.047 38.320 |
-78.398 38.145 |
011001011001010000 |
19 |
-78.750 37.969, -78.398 38.320 |
-78.574 38.145 |
0110010110010100000 |
20 |
-78.750 37.969, -78.398 38.145 |
-78.574 38.057 |
01100101100101000000 |
21 |
-78.574 37.969, -78.398 38.145 |
-78.486 38.057 |
011001011001010000001 |
22 |
-78.574 37.969, -78.398 38.057 |
-78.486 38.013 |
0110010110010100000010 |
23 |
-78.486 37.969, -78.398 38.057 |
-78.442 38.013 |
01100101100101000000101 |
24 |
-78.486 38.013, -78.398 38.057 |
-78.442 38.035 |
011001011001010000001011 |
25 |
-78.486 38.013, -78.442 38.057 |
-78.464 38.035 |
0110010110010100000010110 |
The bounding boxes corresponding to the Geohashes in the table above are shown as red polygons on this map:
The org.locationtech.geomesa.utils.geohash.GeoHash
class provides tools for working
with Geohashes. The data for the table above may be generated with the following Scala code:
import org.locationtech.geomesa.utils.geohash.GeoHash
for (p <- 1 to 25) {
val gh = GeoHash(-78.48, 38.03, p)
println(s"""$p ${gh.bbox.toText} ${gh.getPoint.toText} ${gh.toBinaryString}""")
}
Base-32 Encoding¶
Geohashes are encoded as strings with the following base-32 representation:
dec |
binary |
base-32 |
dec |
binary |
base-32 |
---|---|---|---|---|---|
0 |
00000 |
0 |
16 |
10000 |
h |
1 |
00001 |
1 |
17 |
10001 |
j |
2 |
00010 |
2 |
18 |
10010 |
k |
3 |
00011 |
3 |
19 |
10011 |
m |
4 |
00100 |
4 |
20 |
10100 |
n |
5 |
00101 |
5 |
21 |
10101 |
p |
6 |
00110 |
6 |
22 |
10110 |
q |
7 |
00111 |
7 |
23 |
10111 |
r |
8 |
01000 |
8 |
24 |
11000 |
s |
9 |
01001 |
9 |
25 |
11001 |
t |
10 |
01010 |
b |
26 |
11010 |
u |
11 |
01011 |
c |
27 |
11011 |
v |
12 |
01100 |
d |
28 |
11100 |
w |
13 |
01101 |
e |
29 |
11101 |
x |
14 |
01110 |
f |
30 |
11110 |
y |
15 |
01111 |
g |
31 |
11111 |
z |
By this convention, the 25-bit Geohash that contains (-78.48, 38.03) described above would be encoded as “dqb0q”:
01100 10110 01010 00000 10110
----- ----- ----- ----- -----
d q b 0 q