如何使用 Bootleaf / esri-leaflet 查询带有多边形图层的点?

如何解决如何使用 Bootleaf / esri-leaflet 查询带有多边形图层的点?

我正在使用 Bootleaf IAG framework

我不知道如何获得过滤层的边界坐标。

我正在修改 bootleaf 代码查询具有多边形图层的点。 Query Widget 已经允许用户绘制多边形,但我想从我的 arcgis 服务器上托管的图层中选择一个多边形。我通过删除文本字段并允许我的用户从下拉菜单中选择多边形图层和值来修改过滤器小部件。这工作正常。

现在我需要获取 layer.setWhere(where,handleError); 代码的结果并将其与下面的查询结合使用。我需要 selectedpolygon 等于 layer.setWhere(where,handleError); 的结果并使用查询.within 部分中的边界坐标。

我尝试了很多方法L.latLngBoundsgetBounds()toGeoJSON().features[0].geometry.coordinates 仅举几例,但我不知道如何突破界限。正确的代码是什么?

    const query = L.esri.query({ url: pointInpolygonUrl })
        .token(pointInpolygonData.token)
        .within(selectedpolygon)
    query.run(function (error,data,response) {
        if (error) {
            console.log(error);
            return;
        }

6/8/2021 编辑(基于 Seth Lutske 的评论

我没有提供代码沙箱有两个原因:1 - bootleaf 有很多文件,2 - 我的所有层都需要安全登录到 arcgis。希望我能提供足够的信息来获得帮助。

  1. selectedpolygon 是否改变了我的预期?目前有 没有名为 selectedpolygon 的变量,因为我不知道 格式化它的正确方法selectedpolygon 是我想要的 调用过滤结果 layer.setWhere(where,handleError);。我设置 随着值的变化,多边形图层在地图上进行过滤。一世 可以验证它是否按预期过滤。

  2. selectedpolygon 格式 - 这就是我的问题所在。我不能 似乎根据引导叶层的方式找到正确的格式 配置。我从 var selectedpolygon = 开始 layer.features.geometry.coordinates; 并得到一个未定义的几何体 错误。我继续尝试我能想到的所有其他代码 界限。

  3. 边界坐标可能不是正确的术语。我想要 运行查询以查找过滤多边形内的所有点。 为了实现这一点,我的理解是我需要使用 查询within 部分中过滤多边形的边界。

6/8/2021 编辑 #2

这个 link 可能最有利于展示层是如何构建的。我修改了这段代码,去掉了文本输入,添加了下拉菜单,但是基本定义应该是一样的。

第 1605 行是 function addFilter()

第 1804 行是 function applyFilter()

第 1927 行是 layer.setWhere(where,handleFilterError);

照片 1:console.log("polygon layer",layer)

Photo 1

照片 2:展开 _layers

Photo 2

照片 3:展开的 _rings(我没有找到 ToGetJSON,但我在此部分找到了 ToGeoJSON

Photo 3

看起来如果我能到达 _rings 就应该没问题,但这正是我缺乏知识的地方。

解决方法

我对 bootleaf 了解不多,但这里有一些提示可以帮助您入门。根据您的问题和评论,这有望使事情变得清晰,并指导您如何在您的场景中应用您需要的内容。

将 UI 挂接到 setWhere

当用户从 UI 中选择一个选项时,您可以在从 arcgis 服务器提供的图层上调用 setWhere。假设有一个多边形图层,在我的示例中,名为 statesFeatureLayer,其中 is an L.esri.featureLayer

// Create polygon layer of states
const statesFeatureLayer = EL.featureLayer({
  url: "polygon_featurelayer_url_from_arcgis_server"
}).addTo(map);

还有一个点层:

// Create points layer
const pointsFeatureLayer = EL.featureLayer({
  url: "points_featurelayer_url"
}).addTo(map);

现在有一些 UI,它必须触发 setWhere 在这一层上被调用。因此,在 UI 中的任何地方,您要运行在图层上设置过滤器的功能,然后根据结果查询其他图层,我们将运行函数调用 runQuery:

function runQuery(){
  statesFeatureLayer.setWhere(querystring,callback)
}

setWhere 触发后运行回调

听起来您已经弄清楚了这部分,并且您的 setWhere 函数运行正常。但是,setWhere 还接受一个可选的回调函数作为其第二个参数,该函数在 where 已设置并刷新图层后运行。让我们深入研究一下。在回调中,我们将要获取地图上当前处于活动状态的所有要素:

function runQuery(){
  statesFeatureLayer.setWhere(querystring,() => {
    statesFeatureLayer.eachActiveFeature(feature => {
      // do something with features
    })
  })
}

针对多边形图层的活动特征运行查询以测试点图层

eachActiveFeature 内,我们可以在 pointsFeatureLayer 上运行查询:

function runQuery(){
  statesFeatureLayer.setWhere(querystring,() => {
    statesFeatureLayer.eachActiveFeature(feature => {
      pointsFeatureLayer
        .query()
        .within(feature.toGeoJSON())
        .run((error,data) => {
          console.log(data);
        });
    })
  })
}

现在正在运行一个查询,该查询询问 pointsFeatureLayer 中位于 statesFeatureLayer 的每个活动特征的几何中的任何点。

这样做的缺点是我们无法将所有活动功能作为一个组运行查询。 within 查询方法(以及大多数其他 query methods)可以接受单一特征,无论是 L.Polygon、L.Polyline 还是 L.GeoJSON 的形式。虽然我曾尝试创建一个 L.featureGroup 并在其上调用 .toGeoJSON,但 within 似乎需要一个只描述单个形状的 GeoJSON。因此,如果您有多个功能,则必须将它们组合在一起。例如,您可能在全局范围级别有一些变量 results = [],那么在 run 的回调中,您可以将结果推送到 results,这将给您所有结果多变的。这可能需要在 js 中进行一些按摩才能使其正确。

Working Codesandbox

这里有 2 个 UI 元素导致 runQuery 运行。下拉菜单或复选框。您会看到,在每次 UI 更改时,都会使用从 UI 构造的查询字符串调用 setWhere(如果选中复选框,则为该州的 setWhere,以及该州和 california 的 setwhere)。当 setWhere 被调用时,它的回调然后只针对当前活动特征对点图层运行查询,然后返回点图层中的任何点是 within 每个活动特征。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?