问题
I'm looking for a library in javascript that would allow me to make geospatial queries. I know about OpenLayers and GoogleMaps, but this two do not support things like union intersection and so on.
+----+
| |
| +-+--+
+--+-+ |
| |
+----+
to
+----+
| |
| +--+
+--+ |
| |
+----+
回答1:
Update 2014-04-29: Check out Turf, looks really promising
JSTS can do unions of geometric objects in the browser. JSTS integrates with the openlayers library and it extends openlayers geometric classes (e.g. OpenLayers.Geometry.Polygon) so they are capable of geometric operations. Example:
>> 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 is nice if you want to do serverside geometric operations in JS.
回答2:
I wrote Spatial Query https://github.com/netshade/spatial_query to do just this.
Alternatively, you could check out http://geoscript.org/index.html , which is likely better supported than Spatial Query is. If you decide to check out SQ though, I'd be flattered to hear if it worked for you.
回答3:
You can extend OpenLayers to support this operation. I make this using OpenLayers native functions. Try this, maybe you must fix and customize this code.
// 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
回答4:
You can get query results for a radius or rectangle that includes your polygon, then filter the results using the technique described here: http://msdn.microsoft.com/en-us/library/cc451895.aspx. The example uses bing maps, but you could easily use the same principles using whatever mapping service you prefer.
回答5:
Did you look at geoUtils?
I am not sure whether it supports the union op, but might be worth giving a try.
回答6:
If you have a server available, you can run the ESRI ArcGIS Server 10 and start a Geometry service. This has this functionality available through an API (including REST) interface. Look at their help documentation: SOAP SDK
回答7:
You cound use the PostGIS DB wich has support for JDBC. Check here for an example: http://postgis.refractions.net/docs/ch05.html#id2644717
:)
DsP
回答8:
Do you really need to do this on the client side? Union is a fairly heavy operation and might be better done on the server side.
Another API that may be useful is the ArcGIS Javascript API, although from what I can see I don't think it will do union without ArcGIS Server: http://help.arcgis.com/en/webapi/javascript/arcgis/
来源:https://stackoverflow.com/questions/4717872/geospatial-queries-in-javascript