GeoMesa在处理大规模时空数据方面比较有名,华为的CloudTable底层是用的Hbase+GeoMesa,阿里的Hbase Ganos也是基于GeoMesa和GeoTools,两者官网有详细使用教程。
1、概念备忘录
OGC:开放地理空间信息联盟(Open Geospatial Consortium),一个非盈利的国际标准组织,它制定了数据模型和相关操作的一系列标准,GIS厂商按照这个标准进行开发可保证空间数据的互操作。
GeoTools:一个遵循OGC标准,用于处理地理空间数据的工具包,实现了OGC标准的数据模型和接口,很有名。
Geometry:OGC定义的用来表示一个空间对象,e.g.空间的点、空间的线、空间的面。注意:Geometry只包含空间对象的位置信息,并不包含其附带的属性信息。时间信息是作为属性存储的。
CQL&ECQL:ECQL是CQL的扩展版,比CQL更强大。ECQL更多的是定义filter,类似于SQL语言的where子句,通过文本描述的方式来筛选出目标对象。
WKT:Well-known text,是OGC定义的一种用文本来描述空间对象的格,比如点就可以写成POINT(0,0)。
WKB:Well-known Binary,是OGC定义的一种通过序列化字节来描述几何对象的格式。与WKT相比,其优点在于数据较小,适宜传输。
2、注意事项
(1)基础索引有四个:ID、属性、Z2、Z3。默认情况下是全部建立,这样对所有的查询场景来说都能提供较高的性能,但会占用较多的存储空间。想禁用某个基础索引的方法为:
//创建索引
SimpleFeatureType simpleFeatureType = SimpleFeatureTypes.createType(schemaName, schemaDescription);
simpleFeatureType.getUserData().put("geomesa.disable.z2.index",true);
另外,可以对基础索引进行个性化定义。index_name取值为id,attr,z2,z3,xz2,xz3,xyz之一,
//sft.getUserData().put("geomesa.indices.enabled", "{index_name}:{col1}:{col2}:...,{index_name}:{col}");
simpleFeatureType.getUserData().put("geomesa.indices.enabled", "z3:start:dtg,z3:end:dtg,attr:name:dtg");
(2)写入时空对象
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
//点要素
geometryFactory.createPoint(new Coordinate(lon, lat))
//WKT
WKTReader reader = new WKTReader(geometryFactory);
Point point = (Point) reader.read("POINT (log lat)");
//插入单条记录
SimpleFeatureWriter writer =(SimpleFeatureWriter)ds.getFeatureWriterAppend(sft.getTypeName(), Transaction.AUTO_COMMIT);
SimpleFeature toWrite=writer.next();
toWrite.setAttributes(feature.getAttributes());
toWrite.getUserData().putAll(feature.getUserData());
writer.write();
writer.close();
//批量插入
List<SimpleFeature> features=...
SimpleFeatureStore featureStore = (SimpleFeatureStore) ds.getFeatureSource(sft.getTypeName());
List<FeatureId> featureIds = featureStore.addFeatures(new ListFeatureCollection(sft,features));
(3)