本文介绍通过完整的代码示例帮助用户快速搭建HBase Ganos测试环境,从而快速掌握简单的Ganos时空操作,包括连接数据库、创建索引、数据入库、查询等。
依赖包如下。
<properties>
<geomesa.version>3.1.1</geomesa.version>
<hbase.version>1.8.0</hbase.version>
</properties>
<dependencies>
<dependency>
<groupId>org.locationtech.geomesa</groupId>
<artifactId>geomesa-hbase-datastore_2.11</artifactId>
<version>${geomesa.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-common</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-protocol</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.aliyun.hbase</groupId>
<artifactId>alihbase-client</artifactId>
<version>${hbase.version}</version>
<exclusions>
<exclusion>
<artifactId>com.google.guava</artifactId>
<groupId>guava</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.aliyun.hbase</groupId>
<artifactId>alihbase-server</artifactId>
<version>${hbase.version}</version>
</dependency>
<dependency>
<groupId>com.aliyun.hbase</groupId>
<artifactId>alihbase-common</artifactId>
<version>${hbase.version}</version>
</dependency>
<dependency>
<groupId>com.aliyun.hbase</groupId>
<artifactId>alihbase-protocol</artifactId>
<version>${hbase.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<inherited>true</inherited>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
示例代码以及说明如下。
package com.aliyun.tst;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.Point;
import org.geotools.data.DataStore;
import org.geotools.data.DataStoreFinder;
import org.geotools.data.Query;
import org.geotools.data.Transaction;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureWriter;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.feature.simple.SimpleFeatureBuilder;
import org.geotools.filter.text.ecql.ECQL;
import org.geotools.geometry.jts.JTSFactoryFinder;
import org.locationtech.geomesa.utils.geotools.SimpleFeatureTypes;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.filter.FilterFactory2;
import org.opengis.filter.sort.SortBy;
import org.opengis.filter.sort.SortOrder;
;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Demo {
public static final String ZK = "localhost"; //Zookeeper地址
public static void main(String args[]){
try{
DataStore ds=null;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd' 'HH:mm:ss");
//配置连接参数
Map<String, String> params= new HashMap<>();
params.put("hbase.zookeepers",ZK);
params.put("hbase.catalog","test_catalog");
//初始化DataStore
ds= DataStoreFinder.getDataStore(params);
//创建SimpleFeatureType定义表结构
String sft_name="point";
SimpleFeatureType sft=
SimpleFeatureTypes.createType(sft_name, "name:String,dtg:Date,*geom:Point:srid=4326");
//指定压缩方式gz
sft.getUserData().put("geomesa.table.compression.enabled", "true");
sft.getUserData().put("geomesa.table.compression.type", "gz");
//创建数据表
ds.createSchema(sft);
/*
* GeometryFactory 用来创建空间对象
*/
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
SimpleFeatureBuilder builder = new SimpleFeatureBuilder(sft);
//构造空间数据(点)
Point point1 = geometryFactory.createPoint(new Coordinate(120.301,35.086));
Point point2 = geometryFactory.createPoint(new Coordinate(120.301,35.076));
Point point3 = geometryFactory.createPoint(new Coordinate(120.301,35.066));
//构造点SimpleFeature
List<SimpleFeature> features=new ArrayList<>();
features.add(builder.buildFeature("1", new Object[]{"point1",new Date(),point1}));
features.add(builder.buildFeature("2", new Object[]{"point2",new Date(),point2}));
features.add(builder.buildFeature("3", new Object[]{"point3",new Date(),point3}));
//要素入库
SimpleFeatureWriter writer=(SimpleFeatureWriter)ds.getFeatureWriterAppend(sft_name, Transaction.AUTO_COMMIT);
for(SimpleFeature feature:features){
SimpleFeature toWrite=writer.next();
toWrite.setAttributes(feature.getAttributes());
toWrite.getUserData().putAll(feature.getUserData());
writer.write();
}
writer.close();
//构造时空查询条件
long t1=format.parse("2019-01-19 11:45:00").getTime();
long t2=format.parse("2019-02-21 12:15:00").getTime();
String sortField="dtg";//排序字段,这里设为时间
FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();
SortBy[] sort = new SortBy[]{ff.sort(sortField, SortOrder.DESCENDING)};
//构造Query对象用于查询
Query query = new Query(sft_name, ECQL.toFilter( "bbox(geom,120,20,130,40) AND dtg >= "+t1+" AND dtg <= "+t2));
query.setSortBy(sort);
SimpleFeatureCollection result=ds.getFeatureSource(sft_name).getFeatures(query);
SimpleFeatureIterator iterator=result.features();
//输出查询结果
long sum = 0;
while (iterator.hasNext()) {
System.out.println(iterator.next());
sum++;
}
System.out.println("查询总数:" + sum);
}
catch (Exception e){
e.printStackTrace();
}
}
}
运行成功后可以看到入库的三个点要素被打印出来,运行结果如下。