我通過本機api將shapefile(TM_WORLD_BORDERS-0.3.shp)中的數據攝入到geomesa(在accumulo上)。然後,我想再次使用Native Api查詢數據,以查找包含由用戶(基本上包含該點的幾何體中的任何多邊形)給出的點(lat,lon)的geomesa中的任何東西。GeoMesa Native API(Accumulo) - 多邊形相交過濾器:在SimpleFeature中缺少「the_geom」
更多或多或少模仿「問:我是怎麼上的?:使用點擊一個點,檢查面圖層」從http://docs.geotools.org/latest/userguide/library/main/filter.html
GeoMesaQuery q = GeoMesaQuery.GeoMesaQueryBuilder.builder()
.within(-180.0,-90.0,180.0,90.0) // needed or the query throws a null-pointer ex
.filter(ff.contains(ff.property("the_geom"), ff.literal(point)))
.build();
然而,當我運行查詢,我得到一個錯誤(在accumulo):
Failed to get multiscan result
java.util.concurrent.ExecutionException: java.lang.RuntimeException: Can't handle property 'the_geom' for feature type dtg:Date,payload:Bytes,*geom:Geometry:srid=4326:index-value=true,FIPS:String,ISO2:String,ISO3:String
at org.apache.accumulo.tserver.scan.ScanTask.get(ScanTask.java:126)
at org.apache.accumulo.tserver.TabletServer$ThriftClientHandler.continueMultiScan(TabletServer.java:700)
at org.apache.accumulo.tserver.TabletServer$ThriftClientHandler.startMultiScan(TabletServer.java:665)
at sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.accumulo.core.trace.wrappers.RpcServerInvocationHandler.invoke(RpcServerInvocationHandler.java:46)
at org.apache.accumulo.server.rpc.RpcWrapper$1.invoke(RpcWrapper.java:74)
at com.sun.proxy.$Proxy21.startMultiScan(Unknown Source)
at org.apache.accumulo.core.tabletserver.thrift.TabletClientService$Processor$startMultiScan.getResult(TabletClientService.java:2381)
at org.apache.accumulo.core.tabletserver.thrift.TabletClientService$Processor$startMultiScan.getResult(TabletClientService.java:2365)
at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:39)
at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39)
at org.apache.accumulo.server.rpc.TimedProcessor.process(TimedProcessor.java:63)
at org.apache.thrift.server.AbstractNonblockingServer$FrameBuffer.invoke(AbstractNonblockingServer.java:518)
at org.apache.accumulo.server.rpc.CustomNonBlockingServer$CustomFrameBuffer.invoke(CustomNonBlockingServer.java:106)
at org.apache.thrift.server.Invocation.run(Invocation.java:18)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.accumulo.fate.util.LoggingRunnable.run(LoggingRunnable.java:35)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.RuntimeException: Can't handle property 'the_geom' for feature type dtg:Date,payload:Bytes,*geom:Geometry:srid=4326:index-value=true,FIPS:String,ISO2:String,ISO3:String
at org.locationtech.geomesa.filter.expression.FastPropertyName.evaluate(FastPropertyName.scala:61)
at org.geotools.filter.GeometryFilterImpl.getGeometries(GeometryFilterImpl.java:108)
at org.geotools.filter.GeometryFilterImpl.evaluate(GeometryFilterImpl.java:237)
at org.geotools.filter.AndImpl.evaluate(AndImpl.java:44)
at org.locationtech.geomesa.accumulo.iterators.KryoLazyFilterTransformIterator$$anonfun$init$5.apply(KryoLazyFilterTransformIterator.scala:78)
at org.locationtech.geomesa.accumulo.iterators.KryoLazyFilterTransformIterator$$anonfun$init$5.apply(KryoLazyFilterTransformIterator.scala:78)
at org.locationtech.geomesa.accumulo.iterators.KryoLazyFilterTransformIterator.findTop(KryoLazyFilterTransformIterator.scala:117)
at org.locationtech.geomesa.accumulo.iterators.KryoLazyFilterTransformIterator.seek(KryoLazyFilterTransformIterator.scala:94)
at org.apache.accumulo.core.iterators.system.SourceSwitchingIterator.readNext(SourceSwitchingIterator.java:135)
at org.apache.accumulo.core.iterators.system.SourceSwitchingIterator.seek(SourceSwitchingIterator.java:182)
at org.apache.accumulo.tserver.tablet.Tablet.lookup(Tablet.java:562)
at org.apache.accumulo.tserver.tablet.Tablet.lookup(Tablet.java:681)
at org.apache.accumulo.tserver.scan.LookupTask.run(LookupTask.java:114)
at org.apache.htrace.wrappers.TraceRunnable.run(TraceRunnable.java:57)
我可以看到我的功能有* GEOM型,但不是 「the_geom」 型。然後我嘗試覆蓋SimpleFeatureView的'populate'和'getExtraAttributes'方法,但是getExtraAttributes不會讓我綁定幾何體......(注意:我也嘗試從填充簽名給setAttribute gmtr以相同的錯誤) 。
GeoMesaIndex<Shapefile> index = AccumuloGeoMesaIndex.build(
config.getString("tableName"),
config.getString("zookeeperHostPort"),
config.getString("accumuloInstance"),
config.getString("user"),
config.getString("password"),
false,
new ShapefileValueSerializer(),
new SimpleFeatureView<Shapefile>() {
@Override
public void populate(SimpleFeature sf, Shapefile t, String string, byte[] bytes, Geometry gmtr, Date date) {
sf.setAttribute("the_geom", t.the_geom);
}
@Override
public List<AttributeDescriptor> getExtraAttributes() {
AttributeTypeBuilder atb = new AttributeTypeBuilder();
return Lists.newArrayList(
atb.binding(Geometry.class).buildDescriptor("the_geom")
);
}
});
錯誤:
Exception in thread "main" java.lang.IllegalArgumentException: Invalid spec string at index 85. Expected one of: attribute type binding, geometry type binding.
at org.locationtech.geomesa.utils.geotools.SimpleFeatureTypes$.createType(SimpleFeatureTypes.scala:98)
at org.locationtech.geomesa.utils.geotools.SimpleFeatureTypes$.createType(SimpleFeatureTypes.scala:85)
at org.locationtech.geomesa.utils.geotools.InitBuilder.build(SftBuilder.scala:174)
at org.locationtech.geomesa.api.BaseBigTableIndex$.org$locationtech$geomesa$api$BaseBigTableIndex$$buildSimpleFeatureType(BaseBigTableIndex.scala:132)
at org.locationtech.geomesa.api.BaseBigTableIndex.<init>(BaseBigTableIndex.scala:40)
at org.locationtech.geomesa.accumulo.nativeapi.AccumuloGeoMesaIndex.<init>(AccumuloGeoMesaIndex.scala:26)
at org.locationtech.geomesa.accumulo.nativeapi.AccumuloGeoMesaIndex$.buildWithView(AccumuloGeoMesaIndex.scala:72)
at org.locationtech.geomesa.accumulo.nativeapi.AccumuloGeoMesaIndex$.build(AccumuloGeoMesaIndex.scala:53)
at org.locationtech.geomesa.accumulo.nativeapi.AccumuloGeoMesaIndex.build(AccumuloGeoMesaIndex.scala)
at com.comcept.geomesa.ingesttool.AccumuloGeomesaNGAIngest.main(AccumuloGeomesaNGAIngest.java:148)
Caused by: org.parboiled.errors.ParsingException: Invalid spec string at index 85. Expected one of: attribute type binding, geometry type binding.
at org.locationtech.geomesa.utils.geotools.SimpleFeatureSpecParser$$anonfun$parse$1.apply(SimpleFeatureSpecParser.scala:39)
at org.locationtech.geomesa.utils.geotools.SimpleFeatureSpecParser$$anonfun$parse$1.apply(SimpleFeatureSpecParser.scala:39)
at scala.Option.getOrElse(Option.scala:121)
at org.locationtech.geomesa.utils.geotools.SimpleFeatureSpecParser$.parse(SimpleFeatureSpecParser.scala:39)
at org.locationtech.geomesa.utils.geotools.SimpleFeatureSpecParser$.parse(SimpleFeatureSpecParser.scala:28)
... 10 more
因此,與所有的說,是有可能做到用使用GeoMesa的原生API過濾器的多邊形點圍堵檢查?我無法使用ff.property(任何版本的「geom」,例如「the_geom」,「* geom」等)查詢幾何圖形
你是如何從shapefile中提取數據的?在本地API的插入方法中,如果您從the_geom傳遞幾何,那麼您將能夠通過名稱'geom'查詢它。 https://github.com/locationtech/geomesa/blob/master/geomesa-native-api/src/main/java/org/locationtech/geomesa/api/GeoMesaIndex.java#L51 –
Emilio你是男人,我通過gf.createPoint插入(就像我在教程中和在幾何體的github頁面中的測試中看到的那樣)。我是否應該考慮這個問題,或者只是把它留下來幫助其他可能會插入錯誤的人? –
不錯,很高興提供幫助。是的,我會留給子孫後代。如果文檔/教程中有任何內容可以更清楚地告訴我們 - 您可以在我們的gitter中聊天或發送電子郵件給用戶列表(在geomesa.org上的鏈接) –