JavaScript中的地理空间查询

23

我正在寻找一个JavaScript库,可以让我进行地理空间查询。我知道OpenLayers和GoogleMaps,但这两个不支持像联合,交集等操作。

+----+
|    |
|  +-+--+
+--+-+  |
   |    |
   +----+

    +----+
    |    |
    |    +--+
    +--+    |
       |    |
       +----+

联合必须在客户端的JavaScript中进行。 - wolktm
8个回答

6

更新于2014年4月29日:请查看Turf,看起来非常有前途

JSTS可以在浏览器中对几何对象进行联合。JSTS与openlayers库集成,并扩展了openlayers几何类(例如OpenLayers.Geometry.Polygon),使它们能够进行几何运算。例如:

>> var poly1 = OpenLayers.Geometry.Polygon.createRegularPolygon(
                                   new OpenLayers.Geometry.Point(0.0,0.0), 2, 5);
>> var poly2 = OpenLayers.Geometry.Polygon.createRegularPolygon(
                                   new OpenLayers.Geometry.Point(1.0,1.0), 2, 4);
>> var poly_u = poly1.union(poly2);
>> var poly_d = poly1.difference(poly2);
>> print(poly_u);
POLYGON((1.5667154718422638 -0.4142135623730949,1.1755705045849463 -1.618033988749895,
  -1.1755705045849465 -1.6180339887498947,-1.902113032590307 0.618033988749895,
  -0.41421356237309503 1.6990562312593451,-0.4142135623730949 2.414213562373095,
   2.414213562373095 2.414213562373095,2.414213562373095 -0.4142135623730949,
   1.5667154718422638 -0.4142135623730949))

Geoscript JS很不错,如果你想在JS中进行服务器端几何操作。


Geoscript在这里已经被提出,但我认为它仅限于服务器端。JSTS看起来就是我要找的解决方案! - wolktm
啊,我以为 geoscript-js --> 是 JavaScript --> 必须是一个浏览器库。但我找不到如何在浏览器中运行它,所以你一定是对的。那就用 jsts 吧 :) - ivy

3

事实上,我现在使用spatial_query,我很喜欢它,但是它在union方面有一些bug :( 谈到geoscript,它看起来像某种服务器端代码,它能在浏览器中运行吗? - wolktm
如果您能够在这里或者Spatial Query的GH问题中提供一个导致错误的输入数据示例,我会尽力修复实现。 - Chris Zelenak
就 AFA geoscript 而言,你是正确的,我很抱歉 - 我没有更深入地了解软件包要求。可能可以移植,但我目前无法确定 - 对于不准确我感到抱歉。 - Chris Zelenak

1

您可以扩展OpenLayers以支持此操作。我使用OpenLayers的本地函数来实现这一点。尝试一下,也许您需要修复和定制此代码。

// The first object is instanced using data given from gmaps
var objBound1 = new OpenLayers.Bounds();
objBound1.extend(new OpenLayers.LonLat(2,2));
objBound1.extend(new OpenLayers.LonLat(8,8));

// The second object is instanced using data given from gmaps
var objBound2 = new OpenLayers.Bounds();
objBound2.extend(new OpenLayers.LonLat(5,5));
objBound2.extend(new OpenLayers.LonLat(10,10));

// Extract limits from our objects
var arrBound1 = objBound1.toArray();
var arrBound2 = objBound2.toArray();

// Determine an virtual bound. It must contain our two bounds
var intMinLeft = arrBound1.left < arrBound2.left ? arrBound1.left : arrBound2.left;
var intMinTop = arrBound1.top < arrBound2.top ? arrBound1.top : arrBound2.top;
var intMaxRight = arrBound1.right > arrBound2.right ? arrBound1.right : arrBound2.right;
var intMaxBottom = arrBound1.bottom > arrBound2.bottom ? arrBound1.bottom : arrBound2.bottom;

// Search all points of virtual bound, storing the points contained in bound1 or bound2
var objBoundResult = new OpenLayers.Bounds();
for(var intI = intMinLeft; intI < intMaxRight; intI++) {
    for(var intJ = intMinTop; intJ < intMaxBottom; intJ++) {
        if(objBound1.containsLonLat(new OpenLayers.LonLat(intI, intJ)) || objBound2.containsLonLat(new OpenLayers.LonLat(intI, intJ))) {
            objBoundResult.add(intI, intJ);
        }
    }
}

// objBoundResult is what you want

我还没有尝试过这个,抱歉耽误了。 - wolktm

0

您可以获取包含多边形的半径或矩形的查询结果,然后使用此处描述的技术过滤结果:http://msdn.microsoft.com/en-us/library/cc451895.aspx。该示例使用 Bing 地图,但您也可以轻松地使用您喜欢的任何地图服务应用相同的原则。


交叉点在OpenLayers库中也有所涉及,但是本文并未涉及联合操作。 - wolktm

0

你看过geoUtils了吗?

我不确定它是否支持联合操作,但值得一试。


-1
如果您有可用的服务器,可以运行ESRI ArcGIS Server 10并启动几何服务。该功能可通过API(包括REST)接口使用。请查看其帮助文档:SOAP SDK

必须是客户端 JavaScript。 - wolktm

-1

服务器端不是问题,我正在寻找客户端JavaScript库。 - wolktm

-1

你真的需要在客户端执行这个操作吗?Union 是一个相当重的操作,最好在服务器端完成。

另一个可能有用的 API 是 ArcGIS Javascript API,尽管从我所看到的来看,我认为它没有 ArcGIS Server 就无法执行 Union:http://help.arcgis.com/en/webapi/javascript/arcgis/


1
ArcGIS - 服务器端且需要付费 - 不用了 ;) 服务器端速度慢 (),我只需要对两个多边形进行联合,因此 JavaScript 的性能不是问题(至少在 WebKit 中)。 - wolktm
你查询的是哪个服务?如果该服务通过接受一个多边形来限制您,那么像您所说的在客户端进行联合可能是您唯一的选择。否则,如果您正在对自己的服务器进行查询,为什么不在服务器端进行呢?如果只有两个多边形,则可以查询两次并聚合结果。 - Gnat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接