0

我正在使用Bootleaf IAG 框架

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

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

现在我需要获取layer.setWhere(where, handleError);代码的结果,并使用下面的查询来满足它。我需要selectedPolygon等于并使用查询部分中layer.setWhere(where, handleError);的边界坐标。.within

我已经尝试了很多东西,,,,L.latLngBounds等等getBounds()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格式 - 这是我的问题所在。根据 bootleaf 层的配置方式,我似乎无法找到正确的格式。我开始var selectedPolygon = layer.features.geometry.coordinates;并得到一个几何未定义的错误。我继续尝试我能想到的所有其他代码来获得界限。

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

2021 年 6 月 8 日编辑 #2

链接可能最有利于显示图层的构建方式。我修改了这段代码以删除文本输入并添加一个下拉列表,但基本定义应该相同。

第 1605 行是function addFilter()

第 1804 行是function applyFilter()

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

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

照片 1

照片 2: 展开_layers

照片 2

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

照片 3

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

4

1 回答 1

0

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

将 UI 挂钩到setWhere

当用户从 UI 中选择一个选项时,您可以setWhere从 arcgis 服务器调用您提供的图层。假设有一个多边形层,在我的示例中,称为statesFeatureLayeris 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以及大多数其他查询方法)可以接受单一特征,无论是 L.Polygon、L.Polyline 还是 L.GeoJSON 形式。虽然我尝试创建一个 L.featureGroup 并调用.toGeoJSON它,但within似乎需要一个仅描述单个形状的 GeoJSON。因此,如果您有多个功能,则必须将它们合并。例如,您可能results = []在全局范围级别有一些变量,然后在 的回调中run,您可以将结果推送到results,这将在一个变量中为您提供所有结果。这可能需要在 js 中进行一些按摩才能使其正确。

工作代码沙盒

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

于 2021-06-08T21:51:29.447 回答