我有一个geojson对象,使用经度/经度多边形定义Neighborhoods in Los Angeles。在我的web应用程序中,客户端必须处理空间事件的实时流,基本上是经度/经度坐标列表。如何在客户端(在浏览器中)使用Javascript将这些坐标分类为邻域?
我愿意假设邻里关系是排他性的。因此,一旦坐标被归类为邻域X,就没有必要为其他邻域进一步测试它。
发布于 2012-12-09 13:53:36
有一组很好的答案here关于如何解决确定一个点是否包含在多边形中的一般问题。这里有两个选项,这两个选项在您的案例中听起来最有趣:
.getBBox()方法来快速获得边界框。更新:我认为这是一个有趣的问题,所以我想出了一个通用的基于栅格的插件:http://bl.ocks.org/4246925
这与D3和画布元素一起使用,以执行基于栅格的地理编码。一旦将要素绘制到画布上,实际的地理编码为O(1),因此它应该非常快-一个快速的浏览器内测试可以在大约0.5秒内对1000个点进行地理编码。如果你要在实践中使用它,你需要比我在这里更好地处理边缘情况。
如果你不是在浏览器中工作,你仍然可以用node-canvas来做这件事。
发布于 2012-12-08 06:09:47
我已经看到有一些库可以做到这一点,但它们中的大多数都是canvas库,它们可能比您想要的更依赖于近似,并且可能很难适应一个没有直接需要依赖它们进行交集的项目。
我能想到的另一个不太好的选择就是实现ray casting in javascript。这个算法在技术上并不完美,因为它适用于欧几里得几何,而纬度/经度坐标不是(因为它们表示曲面上的点),但对于城市中像居民区这样小的区域,我怀疑这是否重要。
这是一个google maps extension,它基本上完成了这个算法。你必须稍微适应它,但原理是非常相似的。重要的是,你必须将你的坐标预处理成两个坐标的路径,但这应该是可行的。
这绝不是便宜的-对于你必须分类的每个点,你必须测试邻域多边形中的每条线段。如果你期望用户在会话之间一次又一次地重复使用相同的坐标,我很想将他们的邻域存储为其数据的一部分。否则,如果您正在针对很多很多社区进行测试,那么可以实现一些简单的省时方法。例如,您可以对每个社区的极端坐标进行预处理(获取它们的最北、最东、最南和最西的点),并使用这些坐标来定义一个包含城镇的矩形。然后,您可以首先检查候选邻域的点是否位于矩形内,然后运行全光线投射算法。
*如果你决定走这条路,并且在适应这段代码时有任何困难,我很乐意帮助你
https://stackoverflow.com/questions/13770853
复制相似问题