如何解决如何使用 Bootleaf / esri-leaflet 查询带有多边形图层的点?
我正在使用 Bootleaf IAG framework。
我不知道如何获得过滤层的边界坐标。
我正在修改 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。希望我能提供足够的信息来获得帮助。
-
selectedpolygon
是否改变了我的预期?目前有 没有名为selectedpolygon
的变量,因为我不知道 格式化它的正确方法。selectedpolygon
是我想要的 调用过滤结果layer.setWhere(where,handleError);
。我设置 随着值的变化,多边形图层在地图上进行过滤。一世 可以验证它是否按预期过滤。 -
selectedpolygon
格式 - 这就是我的问题所在。我不能 似乎根据引导叶层的方式找到正确的格式 配置。我从var selectedpolygon =
开始layer.features.geometry.coordinates;
并得到一个未定义的几何体 错误。我继续尝试我能想到的所有其他代码 界限。 -
边界坐标可能不是正确的术语。我想要 运行查询以查找过滤多边形内的所有点。 为了实现这一点,我的理解是我需要使用 查询的
within
部分中过滤多边形的边界。
6/8/2021 编辑 #2
这个 link 可能最有利于展示层是如何构建的。我修改了这段代码,去掉了文本输入,添加了下拉菜单,但是基本定义应该是一样的。
第 1605 行是 function addFilter()
第 1804 行是 function applyFilter()
第 1927 行是 layer.setWhere(where,handleFilterError);
照片 1:console.log("polygon layer",layer)
照片 2:展开 _layers
照片 3:展开的 _rings
(我没有找到 ToGetJSON
,但我在此部分找到了 ToGeoJSON
。
看起来如果我能到达 _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 举报,一经查实,本站将立刻删除。