使用Javascript将lon / lat坐标分类为geojson多边形

时间:2012-12-07 20:57:16

标签: javascript node.js d3.js geospatial geojson

我有一个使用lon / lat多边形定义Neighborhoods in Los Angeles的geojson对象。在我的Web应用程序中,客户端必须处理空间事件的实时流,基本上是lon / lat坐标列表。如何在客户端(在浏览器中)使用Javascript将这些坐标分类到邻域?

我愿意假设街区是独家的。因此,一旦将坐标分类为邻域X,就不需要为其他邻域进一步测试它。

2 个答案:

答案 0 :(得分:3)

关于如何解决确定点是否包含多边形的一般问题,有一组很好的答案here。在你的情况下听起来最有趣的两个选项:

  • 正如@Bubbles所提到的,先做一个边界框检查。这非常快,我认为应该可以使用投影或不受保护的坐标。如果您有邻域的SVG路径,则可以使用本机.getBBox()方法快速获取边界框。

  • 我尝试复杂多边形的下一件事,特别是如果你可以使用D3 v3,渲染到离屏画布并检查像素颜色。 D3 v3提供了一个地理路径助手,它可以生成画布路径和SVG路径,我怀疑如果你可以预先渲染这些邻域,这确实非常快。

更新:我认为这是一个有趣的问题,所以我想出了一个基于光栅的通用插件:http://bl.ocks.org/4246925

这适用于使用D3和canvas元素进行基于栅格的地理编码。一旦将特征绘制到画布上,实际的地理编码就是O(1),因此它应该非常快 - 一个快速的浏览器内测试可以在~0.5秒内对1000个点进行地理编码。如果你在实践中使用它,你需要比我在这里更好地处理边缘情况。

如果您没有在浏览器中工作,您仍然可以使用node-canvas执行此操作。

答案 1 :(得分:1)

我已经看到有一些库可以做到这一点,但是大多数都是画布库,它们可能比你想要的更接近于近似值,并且很难适应一个没有直接需要的项目。依靠它们来交叉。

我能想到的唯一另一个不错的选择是实施ray casting in javascript。这个算法在技术上并不完美,因为它是欧几里德几何和纬度/经度坐标不是(因为它们表示曲面上的点),但对于像城市中的邻域一样小的区域,我怀疑这很重要。

这是一个google maps extension基本上是这个算法。你必须调整一下,但原则非常相似。最重要的是你必须将你的坐标预处理成两个坐标的路径,但这应该是可行的。*

这绝不便宜 - 对于您必须分类的每个点,您必须测试邻域多边形中的每个线段。如果您希望用户在会话之间反复使用相同的坐标,我很想将他们的邻居存储为其数据的一部分。否则,如果您正在测试许多社区,那么您可以实现一些简单的时间节省。例如,您可以预处理每个邻域的极端坐标(获取它们的最北,最东,最南和最西点),并使用这些来定义一个刻有城镇的矩形。然后,您可以首先检查候选邻域的点是否位于矩形内,然后运行完整的射线投射算法。

*如果您决定采用这条路线并且在修改此代码时遇到任何问题,我很乐意为您提供帮助