关于GeoHash是什么,有什么用,可以参考我的另一篇文章使用GeoHash查找附近的药店。或者自行Google。

必备技能

要想使用GeoHash,首先得想办法,给数据库中的经纬度生成GeoHash。好消息是,很多数据库软件都提供对应的函数,比如mysql的12.16.10 Spatial Geohash Functions。不过坏消息是,它家亲戚MariaDB并没有对应的方法。对于没有提供原生支持的数据库,这里给出的答案就是用kettle做数据清洗,把GeoHash补写进数据库。

给kettle添加第三方jar包

kettle生成GeoHash只能通过编写脚本实现,鉴于网上已经有很多java脚本可以用了,所以我们导入kettle,就不自己写了。

将.java打包成.jar

下载Class文件

GeoHashHelper.java

编译Class文件

javac GeoHashHelper.class

创建MANIFEST.MF描述文件

echo Main-Class: GeoHashHelper > test.mf

打包jar

jar cvfm GeoHashHelper.jar test.mf GeoHashHelper.class

大功告成

将jar放入kettle

将GeoHashHelper.jar放到kettle的安装目录/lib下面,重新启动kettle。恭喜你,你已经成功的添加了第三方jar包,现在可以在转换中使用了。

编写java脚本生成GeoHash

kttle geohash java

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
  if (first) {
    first = false;

    /* TODO: Your code here. (Using info fields)

    FieldHelper infoField = get(Fields.Info, "info_field_name");

    RowSet infoStream = findInfoRowSet("info_stream_tag");

    Object[] infoRow = null;

    int infoRowCount = 0;

    // Read all rows from info step before calling getRow() method, which returns first row from any
    // input rowset. As rowMeta for info and input steps varies getRow() can lead to errors.
    while((infoRow = getRowFrom(infoStream)) != null){

      // do something with info data
      infoRowCount++;
    }
    */
  }

  Object[] r = getRow();

  if (r == null) {
    setOutputDone();
    return false;
  }

  // It is always safest to call createOutputRow() to ensure that your output row's Object[] is large
  // enough to handle any new fields you are creating in this step.
  r = createOutputRow(r, data.outputRowMeta.size());

  /* TODO: Your code here. (See Sample)

  // Get the value from an input field
  String foobar = get(Fields.In, "a_fieldname").getString(r);

  foobar += "bar";
    
  // Set a value in a new output field
  get(Fields.Out, "output_fieldname").setValue(r, foobar);

  */
    String latitudeStr = get(Fields.In, "latitude").getString(r);
    String longitudeStr = get(Fields.In, "longitude").getString(r);
    Double latitude = Double.parseDouble(latitudeStr);
    Double longitude = Double.parseDouble(longitudeStr);

    GeoHashHelper  geoHashHelper = new GeoHashHelper();
    String geoHash = geoHashHelper.encode(latitude, longitude);

    get(Fields.Out, "geohash").setValue(r, geoHash);

  // Send the row on to the next step.
  putRow(data.outputRowMeta, r);

  return true;
}

版权声明:如无特别声明,本文版权归 一年四季 所有,转载请注明本文链接。

(采用 CC BY-NC-SA 4.0 许可协议进行授权)

本文标题:《 使用kettle生成GeoHash 》

本文链接:https://www.yucanlin.cn/develop/%E4%BD%BF%E7%94%A8kettle%E7%94%9F%E6%88%90GeoHash.html