本文介绍通过完整的代码示例帮助用户快速搭建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();
    }
  }
}
运行成功后可以看到入库的三个点要素被打印出来,运行结果如下。运行结果