hacer - geolocalización con javascript
consultas geoespaciales en javascript (8)
Actualización 2014-04-29: Echa un vistazo a Turf , parece realmente prometedor
JSTS puede hacer uniones de objetos geométricos en el navegador. JSTS se integra con la biblioteca de openlayers y extiende las clases geométricas de openlayers (por ejemplo, OpenLayers.Geometry.Polygon) para que sean capaces de operaciones geométricas. Ejemplo:
>> 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 es bueno si desea realizar operaciones geométricas en el servidor en JS.
Estoy buscando una biblioteca en javascript que me permita hacer consultas geoespaciales. Sé sobre OpenLayers y GoogleMaps, pero estos dos no son compatibles con intersecciones de unión, etc.
+----+
| |
| +-+--+
+--+-+ |
| |
+----+
a
+----+
| |
| +--+
+--+ |
| |
+----+
¿ geoUtils ?
No estoy seguro de si apoya la operación sindical, pero podría valer la pena intentarlo.
¿Realmente necesitas hacer esto en el lado del cliente? Union es una operación bastante pesada y podría realizarse mejor en el lado del servidor.
Otra API que puede ser útil es la API de Javascript de ArcGIS, aunque por lo que puedo ver, no creo que vaya a funcionar sin ArcGIS Server: http://help.arcgis.com/en/webapi/javascript/arcgis/
Escribí Spatial Query https://github.com/netshade/spatial_query para hacer precisamente esto.
Como alternativa, puede consultar http://geoscript.org/index.html , que probablemente sea mejor admitido que la consulta espacial. Sin embargo, si decides revisar SQ, me sentiría halagado de saber si funcionó para ti.
Puede ampliar OpenLayers para admitir esta operación. Lo hago utilizando las funciones nativas de OpenLayers. Prueba esto, tal vez debes arreglar y personalizar este código.
// 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
Puede obtener los resultados de la consulta para un radio o rectángulo que incluya su polígono, luego filtre los resultados utilizando la técnica que se describe aquí: http://msdn.microsoft.com/en-us/library/cc451895.aspx . El ejemplo utiliza los mapas de Bing, pero puede usar fácilmente los mismos principios utilizando el servicio de mapas que prefiera.
Puede utilizar el DB PostGIS que tiene soporte para JDBC. Consulte aquí un ejemplo: http://postgis.refractions.net/docs/ch05.html#id2644717
:)
DsP
Si tiene un servidor disponible, puede ejecutar ESRI ArcGIS Server 10 e iniciar un servicio de geometría. Esto tiene esta funcionalidad disponible a través de una interfaz API (incluyendo REST). Mira su documentación de ayuda: SOAP SDK