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

30

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

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

然后,我有一些具有坐标但没有指示它们位于哪个国家的点。

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

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


1
@altocumulus - 你的评论让我了解到了JavaScript Clipper - 看起来很有趣。而且,我从未想过“点在多边形内”会成为一个标签。 - user5325596
1
同意,那个 [tag:point-in-polygon] 标签让我完全惊讶了;-) 而且几乎有120个与之相关的问题。如果您自己解决了问题,请在此问题下发布答案。 - altocumulus
2
你也可以看一下 https://github.com/turfjs/turf,不过可能对于这个简单的任务来说有点大了。 - Jonatas Walker
3
Turfjs拥有模块化的生态系统,因此您可以通过https://www.npmjs.com/package/turf-inside来使用@turfjs/inside,如果您不使用npm,则可以在github上找到它。 - Andi-lo
显示剩余2条评论
3个回答

20

看起来 d3 已经为你提供了解决方案:https://github.com/d3/d3-geo#geoContains

d3.geoContains(object, point)

如果指定的GeoJSON对象包含指定的点,则返回true,否则返回false。点必须以度为单位的两个元素数组[经度,纬度]来指定。对于Point和MultiPoint几何类型,使用精确测试;对于Sphere,始终返回true;对于其他几何类型,将应用一个epsilon阈值。


3
没问题。需要翻译的内容如下:这是正确的。但值得注意的是,这是 D3 v4 的新方法,在问题发布时还不存在。然而,由于该问题没有针对任何特定版本,因此这个回答完全合法。 - altocumulus
我无法让它工作。geoContains 返回了一个其实是区域中心的点的 false。我验证了这个区域的 geoJson(它是有效的),并在谷歌地图上检查了给定点是否属于该区域(它属于该区域)。 - surfrider
3
所以我的多边形看起来是逆时针的,但是 d3 希望是顺时针的。我测试了 turf 库(感谢 Jonatas Walker 的评论),它可以处理逆时针的多边形。 - surfrider
1
如果你正在使用 TypeScript,请确保你使用 npm i @types/d3 而不是 npm i d3。我曾经花了一整天的时间来寻找一个适用于我的 Angular 项目的库。 - Darrow Hartman

5

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

1
这是一个很棒的库。你能修复链接吗?它指向 https://tufjs.org(缺少r)。 - Raph
1
好的,已经修复了。谢谢! - Ivan -Oats- Storck

5

扩展@thedude的答案,如果您需要在给定的GeoJSON上执行此检查多次,还可以使用geojson-lookup


1
最好使用链接作为参考,并将关键点放入您的答案中。 - Thomas Smyth - Treliant

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