Turfjs中的Point In Polygon始终返回false

4
我正在使用谷歌地图 API 来获取用户的地理位置,如果他们在洛杉矶市内,会告诉他们所在的 LAPD 报告区。我有一个报告区 (RD) 的 GeoJSON 叠加层,从 这里 加载。

我想获得地理位置坐标,并使用 Turfjs 的 booleanPointInPolygon 函数来确定是否在 RD 中,如果是,则返回该 RD。

但无论我做什么,turfjs 函数始终返回 false,尽管我明显位于 RD/Polygon 中。

我下载了GeoJSON 文件并将其作为常规 JSON 文件本地导入。以下是我的函数:

    getRd() {
            const repdist = require("../assets/LAPD_Reporting_Districts.json");
            let point = turf.point([34.05350702472784, -118.24291762202074]);
            var poly;
            repdist.features.forEach(rd => {
                poly = turf.polygon(rd.geometry.coordinates);
                var found = turf.booleanPointInPolygon(point, poly);
                console.log("found: ", found);
            });

据我观察,turf.point和turf.polygon数组已正确形成,执行时没有错误。我已经逐步检查了turf函数,一切看起来都很好。
鉴于代码示例中的坐标(洛杉矶市政厅位于RD 124),我希望结果返回true,但是“found”返回1135个false。

你能发布一个来自GeoJSON的repdist.features数组的示例对象吗?我找不到你链接的geojson文件,因为你没有链接到一个geojson文件,而是一个网页。 - Matthias
您已经回答了下面的问题,但如果您仍然感兴趣,这是正确的链接: https://opendata.arcgis.com/datasets/4398360b1a0242b78904f46b3786ae73_0.geojson - Chachi_Arcola
1个回答

11

我建议检查以下两个事项:

  • turf.point坐标必须是Lon,Lat而不是Lat,Lon。这可能是问题所在,因为-118不是有效的纬度。Lon,Lat是非常常见的约定。

  • 还要检查传递给booleanPointInPolygon的值。 文档显示坐标数组被包装在两个数组中,而不仅仅是一个。


1
先生,我欠你一杯啤酒。我习惯于编写LatLng,从未想过使用LngLat。这确实是问题所在。本周我已经浪费了两天时间来解决这个问题。一旦我使用了正确的格式,一切都按预期工作了。非常感谢你! - Chachi_Arcola
我也请你喝啤酒:我有来自不同库(#fabricjs)的多边形点,但没有闭合点(与起始点相同),所以我只需要将第一个点列表推入即可。 - vonsko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接