是否可以使用 JavaScript 确定 GeoJSON 点是否在 GeoJSON 多边形内?

Posted

技术标签:

【中文标题】是否可以使用 JavaScript 确定 GeoJSON 点是否在 GeoJSON 多边形内?【英文标题】:Is it possible to determine if a GeoJSON point is inside a GeoJSON polygon using JavasScript? 【发布时间】:2016-02-21 11:53:33 【问题描述】:

是否可以仅使用 javascript(通过 d3、topojson 或任何其他方式)确定给定纬度、经度的 GeoJSON 点是否位于给定 GeoJSON 多边形内?

例如,我可以根据教程here绘制一张显示英国国家的地图。

然后我有一些点,它们有坐标,但没有表明它们位于哪个国家/地区。

我想显示每个国家的总点数。

我可以在浏览器中计算出哪个国家/地区包含每个点,还是需要使用 PostGIS 或类似工具在服务器上预处理我的点数据?

【问题讨论】:

"Node.js/Javascript library to test if point is in geojson multipolygon" @altocumulus - 你的评论把我带到了JavaScript Clipper - 看起来很有趣。此外,我永远不会想到“多边形中的点”会是一个标签。 同意,point-in-polygon 标签让我大吃一惊 ;-) 有近 120 个与之相关的问题。如果您自己想出了解决问题的方法,请发布此问题的答案。 你也可以看看github.com/turfjs/turf,对于这个简单的任务来说可能太大了。 @jonatas_walker Turfjs 有一个模块化的生态系统,所以你可以通过npmjs.com/package/turf-inside 使用@turfjs/inside,或者如果你不使用 npm,那么可以在 github 上找到它 【参考方案1】:

好像d3 覆盖了你:https://github.com/d3/d3-geo#geoContains

d3.geoContains(对象,点)

当且仅当指定的 GeoJSON 对象包含指定的点时返回 true,如果对象不包含指定的点,则返回 false。该点必须指定为以度为单位的二元素数组 [longitude, latitude]。对于点和多点几何,使用精确测试;对于 Sphere,总是返回 true;对于其他几何图形,应用 epsilon 阈值。

【讨论】:

这是正确的。不过,公平地说,这是 D3 v4 的一种新方法,在发布问题时不可用。但是,由于该问题不针对任何特定版本,因此此答案完全合法。 我无法完成这项工作。 geoContains 为实际上是区域中心的点返回 false。我验证了这个区域的geoJson(它是有效的)并在谷歌地图上检查了给定点是否属于这个区域(它属于)。 所以在我的多边形看来是逆时针的,但d3 是顺时针的。我测试了turf 库(感谢 Jonatas Walker 的评论),它“吃”了逆时针多边形。 如果您使用的是打字稿,请确保您使用 npm i @types/d3 而不是 npm i d3。我花了一天的时间试图为我的 Angular 项目找到一个库。【参考方案2】:

扩展 @thedude 答案,如果您需要对给定的 GeoJSON 进行多次检查,也可以使用 geojson-lookup。

【讨论】:

最好把链接作为参考,把重点放在你的回答中。【参考方案3】:

Turf.js 提供了一个名为boolean-point-in-polygon 的函数

例如:

var pt = turf.point([-77, 44]);

var poly = turf.polygon([[
  [-81, 41],
  [-81, 47],
  [-72, 47],
  [-72, 41],
  [-81, 41]
]]);

turf.booleanPointInPolygon(pt, poly);
//= true

【讨论】:

以上是关于是否可以使用 JavaScript 确定 GeoJSON 点是否在 GeoJSON 多边形内?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 Javascript 在页面刷新时随机生成预先确定的链接颜色和悬停颜色?

是否有一个 JavaScript 函数可以确定检查哪个无线电输入并使用该无线电输入的值发出警报? [复制]

是否可以通过 JavaScript 中的浏览器确定操作系统中设置的用户区域设置的**国家**?

是否可以使用 Emscripten 从 JavaScript 调用 C++ 函数?

确定一个数组是否包含JavaScript / CoffeeScript中另一个数组的内容[重复]

JavaScript 数字是确定性的吗?