用于测试点是不是在 geojson 多多边形中的 Node.js/Javascript 库

Posted

技术标签:

【中文标题】用于测试点是不是在 geojson 多多边形中的 Node.js/Javascript 库【英文标题】:Node.js/Javascript library to test if point is in geojson multipolygon用于测试点是否在 geojson 多多边形中的 Node.js/Javascript 库 【发布时间】:2013-12-21 03:58:17 【问题描述】:

是否有一些用于 node.js 或 javascript 的库提供检查坐标是否在 geojson 多面体中的功能?

我正在尝试创建一个小型 HTTP API,它告诉我哪些多面体(代表国家、县、市等)包含给定坐标。

我想我会在内存中保存所有多面体及其边界框的列表,然后首先检查每个多边形的边界框是否包含坐标。如果是,那么它会检查坐标是否在多面体本身中。

我知道有一个名为“clipper”的库得到了ported to javascript,但似乎该库没有提供简单的“pointInPolygon”功能,即使库本身非常强大.. 用这个还有可能吗图书馆?

另外,我发现了另一个名为 "geojson-js-utils" 的库,但它似乎不支持多面体(至少那里没有提到)

我发现了一些其他库可以检查一个点是否在多边形中,但我不知道如何使用它们来检查一个点是否在多边形中。

有什么提示吗?

【问题讨论】:

我已经稍微改进了这个问题。我希望你能反驳它。否则,请告诉我缺少什么。 如果一个点在一个多边形中,它不是在包含该多边形的多边形中吗? 换句话说,既然多面体是一个多边形数组,为什么不直接遍历数组呢? @JoshC。因为某些多边形可能是孔。 你能提供一个洞的场景吗?我还不确定为什么这是个问题。 【参考方案1】:

newest Clipper 中有一个高效的 PointInPolygon 函数。它使用 Hormann & Agathos 的算法 The Point in Polygon Problem for Arbitrary Polygons。

documentation of Javascript Clipper's PointInPolygon function 说:


ClipperLib.Clipper.PointInPolygon()

Number PointInPolygon(IntPoint pt, Path poly)

如果为 false,则返回 0,如果 pt 在 poly 上,则返回 -1,如果 pt 在 poly 中,则返回 +1。

用法:

var poly = [X:10,Y:10,X:110,Y:10,X:110,Y:110,X:10,Y:110];
var pt = new ClipperLib.IntPoint(50,50);
var inpoly = ClipperLib.Clipper.PointInPolygon(pt, poly);
// inpoly is 1, which means that pt is in polygon

要测试多多边形,您可以遍历子多边形并使用 PointInPolygon 检查它们。

【讨论】:

问题是裁剪器是这样的:“Javascript Clipper 库执行线和多边形的裁剪和偏移。”,但地理定位是另一回事,它涉及到 sin cos 的东西来考虑半径地球。问题是放在一个球体而不是二维平面上,方法是另一种

以上是关于用于测试点是不是在 geojson 多多边形中的 Node.js/Javascript 库的主要内容,如果未能解决你的问题,请参考以下文章

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

Geojson笔记二:geojson-python-util

叶图 GeoJson 基于自定义值在多边形中填充颜色

如何测试一个点是不是在二维整数坐标中的凸多边形内?

使用jquery在geojson文件中查找多边形中的点

多边形中的geoPHP点