【问题标题】:GeoMesa Native API (Accumulo) - Polygon intersection filter: missing "the_geom" in SimpleFeatureGeoMesa Native API (Accumulo) - 多边形相交过滤器:SimpleFeature 中缺少“the_geom”
【发布时间】:2017-08-09 21:04:38
【问题描述】:

我正在通过本机 api 将 shapefile(TM_WORLD_BORDERS-0.3.shp)中的数据摄取到 geomesa(在 accumulo 上)。然后,我想再次使用 Native Api,在 geomesa 中查询包含用户给出的点 (lat,lon) 的任何数据(基本上是 geomesa 中包含该点的任何多边形)。

或多或少地模仿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();

但是,当我运行查询时,我得到一个错误(累积):

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 的 Native Api 的过滤器进行多边形点包含检查?我无法使用 ff.property 查询几何(“geom”的任何版本,例如“the_geom”、“*geom”等)

【问题讨论】:

  • 您是如何从 shapefile 中提取数据的?在原生 API 的 insert 方法中,如果您从 the_geom 传递几何图形,那么您将能够通过名称“geom”查询它。 github.com/locationtech/geomesa/blob/master/geomesa-native-api/…
  • Emilio 你是那个人,我是通过 gf.createPoint 插入的(就像我在教程和 geomesa 的 github 页面的测试中看到的那样。)。我应该把这个问题记下来还是留下来帮助其他可能插入错误的人?
  • 很好,很高兴为您提供帮助。是的,我会把它留给后代。如果文档/教程中的任何内容可能更清楚,请告诉我们 - 您可以在我们的 gitter 中聊天或向用户列表发送电子邮件(geomesa.org 上的链接)

标签: java accumulo geomesa


【解决方案1】:

添加为官方答案: 可以使用 GeoMesa 原生 API 进行多边形点包含检查 - 您只需确保在调用 insert here 时使用要查询的几何图形。然后几何图形可以在名称"geom" 下进行查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多