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

use*_*596 17 javascript point-in-polygon geojson d3.js topojson

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

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

然后我有一些点有坐标但没有迹象表明它们在哪个国家.

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

我可以确定哪个国家/地区包含浏览器中的每个点,或者我是否需要使用PostGIS或类似方法在服务器上预处理我的点数据?

the*_*ude 12

好像d3你已经介绍过:https://github.com/d3/d3-geo#geoContains

d3.geoContains(对象,点)

当且仅当指定的GeoJSON对象包含指定的点时返回true,如果对象不包含该点,则返回false.必须将该点指定为以度为单位的双元素数组[经度,纬度].对于Point和MultiPoint几何,使用精确测试; 对于一个球体,总是返回true; 对于其他几何图形,应用epsilon阈值.

  • 这是对的.但值得注意的是,这是D3**v4**的新方法,并且在问题发布时尚未提供.但是,由于问题不针对任何特定版本,因此这个答案完全合法. (2认同)
  • 这样看来我的多边形是逆时针的,但是`d3`期望是顺时针的。我测试了“草皮”库(针对Jonatas Walker的评论致谢),并且它“吃了”逆时针多边形。 (2认同)

小智 5

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


Iva*_*van 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
Run Code Online (Sandbox Code Playgroud)