我正在寻找一个允许我进行地理空间查询的javascript库。我知道OpenLayers和GoogleMaps,但是这两个不支持联合交叉等等。
+----+
| |
| +-+--+
+--+-+ |
| |
+----+
到
+----+
| |
| +--+
+--+ |
| |
+----+
答案 0 :(得分:6)
更新2014-04-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))
如果你想在JS中进行服务器端几何操作,那么Geoscript JS是很好的。
答案 1 :(得分:3)
我写了空间查询https://github.com/netshade/spatial_query来做这件事。
或者,您可以查看http://geoscript.org/index.html,这可能比Spatial Query更受支持。如果您决定查看SQ,我会很高兴听到它是否适合您。
答案 2 :(得分: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
答案 3 :(得分:0)
您可以获取包含多边形的半径或矩形的查询结果,然后使用此处描述的技术过滤结果:http://msdn.microsoft.com/en-us/library/cc451895.aspx。该示例使用bing贴图,但您可以使用您喜欢的任何贴图服务轻松使用相同的原则。
答案 4 :(得分:0)
你看过geoUtils了吗?
我不确定它是否支持union op,但可能值得一试。
答案 5 :(得分:-1)
如果您有可用的服务器,则可以运行ESRI ArcGIS Server 10并启动Geometry服务。这通过API(包括REST)接口提供此功能。查看他们的帮助文档:SOAP SDK
答案 6 :(得分:-1)
答案 7 :(得分:-1)
你真的需要在客户端这样做吗? Union是一个相当繁重的操作,可能在服务器端做得更好。
另一个可能有用的API是ArcGIS Javascript API,虽然从我所看到的情况来看,如果没有ArcGIS Server,我认为它不会联合:http://help.arcgis.com/en/webapi/javascript/arcgis/