GeoMesa Native API(Accumulo) - 多边形相交过滤器:在SimpleFeature中缺少“the_geom”

问题描述:

我通过本机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”等)查询几何图形

+1

你是如何从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 –

+0

Emilio你是男人,我通过gf.createPoint插入(就像我在教程中和在几何体的github页面中的测试中看到的那样)。我是否应该考虑这个问题,或者只是把它留下来帮助其他可能会插入错误的人? –

+0

不错,很高兴提供帮助。是的,我会留给子孙后代。如果文档/教程中有任何内容可以更清楚地告诉我们 - 您可以在我们的gitter中聊天或发送电子邮件给用户列表(在geomesa.org上的链接) –

作为正式答案添加: 有可能做使用GeoMesa本地API进行多边形点包含检查 - 只需确保在调用inserthere时使用要查询的几何。然后该几何图形可用于以名称"geom"进行查询。