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

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

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

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

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

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

【问题讨论】:

标签: javascript d3.js geojson topojson point-in-polygon


【解决方案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

【讨论】:

    猜你喜欢
    • 2020-01-03
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2012-05-19
    • 2015-07-26
    相关资源
    最近更新 更多