开发者

geospatial queries in javascript [closed]

开发者 https://www.devze.com 2023-02-05 08:17 出处:网络
Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.

We don’t allow questions开发者_运维技巧 seeking recommendations for books, tools, software libraries, and more. You can edit the question so it can be answered with facts and citations.

Closed 3 years ago.

Improve this question

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

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


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.


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.


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


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.


Did you look at geoUtils?

I am not sure whether it supports the union op, but might be worth giving a try.


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


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


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/

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号