在轨迹场景下,时空对象可简单理解为"轨迹点",包含空间位置、时间、其他属性信息。在HBase Ganos SDK中,时空对象映射的就是SimpleFeature,定义好索引结构后,即可创建。
创建SimpleFeature
每个SimpleFeature由ID,Geometry、时间信息以及其他属性构成。在「快速入门」代码示例中封装了GanosClient类,包含索引创建、轨迹点创建等功能,用于简化用户代码量,建议直接使用。若要使用原生的GeoTools API,可通过SimpleFeatureBuilder类来创建SimpleFeature对象,如下:
SimpleFeatureType sft = ....;
SimpleFeatureBuilder sfBuilder = new SimpleFeatureBuilder(sft);
builder.set("属性名", 属性值);
...
builder.set("geom", Geometry); //设置空间对象,"geom"为固定写法
SimpleFeature feature = builder.buildFeature(object_id + "_" + date.getTime());
设置Geometry对象
在创建SimpleFeature环节中,需要设置geometry对象(见上面代码)。Geometry是SimpleFeature的一部分,存储要素的空间信息。这里所说的“要素”,包括点要素、线要素、面要素等,在时空轨迹的场景下可简单理解为“轨迹点”。GeoTools API提供了GeometryFactory工具类帮助用户创建Geometry对象,具体可以通过两种方式创建:
- 通过Coordinate对象
这种方式创建比较直观,该对象表示一个坐标点,推荐使用。
- 通过WKT文本创建
WKT(Well-known text)是一种空间对象的文本标记语言,如字符串"POINT (1 1)"表示一个点状要素,其坐标为1,1;字符串"LINESTRING(0 2, 2 0, 8 6)"表示一条线状要素,由三个坐标点组成;字符串"POLYGON((20 10, 30 0, 40 10, 30 20, 20 10))"表示一个面状要素,最首尾两个坐标点相同构成一个环。详细信息请参考:参考。
- 点要素以下两种创建方式任选其一:
- 通过Coordinate对象创建
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(); Coordinate coord = new Coordinate(1, 1); Point point = geometryFactory.createPoint(coord);
- 通过WKT创建
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(); WKTReader reader = new WKTReader(geometryFactory); Point point = (Point) reader.read("POINT (1 1)");
- 通过Coordinate对象创建
- 线要素以下两种创建方式任选其一:
- 通过Coordinate对象
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(); Coordinate[] coords = new Coordinate[] {new Coordinate(0, 2), new Coordinate(2, 0), new Coordinate(8, 6) }; LineString line = geometryFactory.createLineString(coordinates);
- 通过WKT描述:
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(); WKTReader reader = new WKTReader( geometryFactory ); LineString line = (LineString) reader.read("LINESTRING(0 2, 2 0, 8 6)");
- 通过Coordinate对象
- 面要素以下两种创建方式任选其一:
- 通过Coordinate对象
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(); Coordinate[] coords = new Coordinate[] {new Coordinate(4, 0), new Coordinate(2, 2), new Coordinate(4, 4), new Coordinate(6, 2), new Coordinate(4, 0) }; LinearRing ring = geometryFactory.createLinearRing( coords ); LinearRing holes[] = null; // use LinearRing[] to represent holes Polygon polygon = geometryFactory.createPolygon(ring, holes );
- 通过WKT描述:
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory( null ); WKTReader reader = new WKTReader( geometryFactory ); Polygon polygon = (Polygon) reader.read("POLYGON((20 10, 30 0, 40 10, 30 20, 20 10))");
- 通过Coordinate对象
设置其他属性
可以通过SimpleFeature的UserData字段设置其他自定义信息,比如HBase Ganos内置了诸多Hints,使用自定义FeatureID(可节省存储空间)。
SimpleFeature feature =...
feature.getUserData().put(Hints.USE_PROVIDED_FID, java.lang.Boolean.TRUE);