是否可以仅使用JavaScript(通过d3、topojson或其他方式),确定给定lat、lon的GeoJSON点是否位于给定的GeoJSON多边形内?
例如,我可以根据这里的教程绘制一个显示英国国家的地图。
然后,我有一些具有坐标但没有指示它们位于哪个国家的点。
我想为每个国家显示总点数。
我可以在浏览器中计算出每个点所在的国家吗?还是需要在服务器上预处理我的点数据,使用PostGIS或类似的工具?
是否可以仅使用JavaScript(通过d3、topojson或其他方式),确定给定lat、lon的GeoJSON点是否位于给定的GeoJSON多边形内?
例如,我可以根据这里的教程绘制一个显示英国国家的地图。
然后,我有一些具有坐标但没有指示它们位于哪个国家的点。
我想为每个国家显示总点数。
我可以在浏览器中计算出每个点所在的国家吗?还是需要在服务器上预处理我的点数据,使用PostGIS或类似的工具?
看起来 d3
已经为你提供了解决方案:https://github.com/d3/d3-geo#geoContains
d3.geoContains(object, point)
如果指定的GeoJSON对象包含指定的点,则返回true,否则返回false。点必须以度为单位的两个元素数组[经度,纬度]来指定。对于Point和MultiPoint几何类型,使用精确测试;对于Sphere,始终返回true;对于其他几何类型,将应用一个epsilon阈值。
geoContains
返回了一个其实是区域中心的点的 false
。我验证了这个区域的 geoJson(它是有效的),并在谷歌地图上检查了给定点是否属于该区域(它属于该区域)。 - surfriderd3
希望是顺时针的。我测试了 turf
库(感谢 Jonatas Walker 的评论),它可以处理逆时针的多边形。 - surfriderTurf.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
扩展@thedude的答案,如果您需要在给定的GeoJSON上执行此检查多次,还可以使用geojson-lookup。