2011-03-04 24 views
15

Contexto: Soy un novato de pocas horas en OpenLayers, por favor sea amable.Guardar y restaurar geometrías en OpenLayers

Fundamentalmente, tengo un mapa con algunos objetos dibujados en él. Si entiendo las cosas correctamente, tengo un número de OpenLayer.Feature.Vector (¿capas?) Con un número de OpenLayer.Geometry "cosas" (como LinearRing) en él.

Por el momento, me parece ser capaz de obtener una buena representación de la geometría, utilizando .toString(). Sí, sospecho que lo estoy haciendo mal, siéntase libre de señalarme en la dirección correcta.

Esto produce una cuerdas muy humanos legible, y base de datos almacenables, tales como:

  • POINT (-104,74560546875 44,2841796875)

  • polígono ((- 96,52783203125 44.6796875, -96,52783203125 45.734375, -92.22119140625 45.734375, -92,22119140625 44.6796875, -96,52783203125 44,6796875))

  • LINESTRING (-105,71240234375 44.6796875, -106,06396484375 42,658203125, -103,55908203125 42,7021484375, -103.47119140625 45.5585 9375, -104,65771484375 45,20703125)

¿Hay una manera de conseguir estos inversa vuelta en el formato de objeto de donde vinieron?

Me encantaría usar JSON, pero parece que no puedo hacer que GeoJSON acepte mi objeto OpenLayer.Feature.Vector (que es lo que dice la propiedad CLASS_NAME cuando miro adentro).

Muchas gracias.

Respuesta

29

El Openlayers.Geometry método de los objetos toString los convierte muy bien en WKT (texto bien conocido). Si usa una capa GIS en la parte superior de su base de datos (como PostGIS para PostGres, SQL Spatial para SQL Server, Spatialite para SQLite, etc.), deberían ofrecer funciones que le permitan procesar WKT.

Pero si quieres convertir ese texto conocido a un nuevo Openlayers.Geometry objeto (en el navegador), puede utilizar la función fromWKT:

var point = OpenLayers.Geometry.fromWKT('POINT(-104.74560546875 44.2841796875)'); 
alert(point.toString()); // POINT(-104.74560546875 44.2841796875) 

Aquí, la variable point contendrá ahora un nuevo Openlayers.Geometry objeto, que tiene las mismas propiedades que el original que usaste toString() en.

Si pasa una matriz a la función fromWKT, devolverá una GeometryCollection que contenga todas las geometrías generadas.

var geometryTexts = [ 
     'POINT(-104.74560546875 44.2841796875)' 
    , 'POLYGON((-96.52783203125 44.6796875,-96.52783203125 45.734375,-92.22119140625 45.734375,-92.22119140625 44.6796875,-96.52783203125 44.6796875))' 
    , 'LINESTRING(-105.71240234375 44.6796875,-106.06396484375 42.658203125,-103.55908203125 42.7021484375,-103.47119140625 45.55859375,-104.65771484375 45.20703125)' 
    ], 
    collection = OpenLayers.Geometry.fromWKT(geometryTexts); 

Después de esto, collection.toString() debería producir lo siguiente:

GEOMETRYCOLLECTION (PUNTO (-104.74560546875 44.2841796875), polígono ((- 96,52783203125 44.6796875, -96,52783203125 45.734375, -92.22119140625 45.734375, -92.22119140625 44.6796875, -96,52783203125 44.6796875), LINESTRING (-105.71240234375 44.6796875, -106.06396484375 42.658203125, -103.55908203125 42.7021484375, -103.47119140625 45.55859375, -104.65771484375 45.20703125))

+0

Gracias, gracias, gracias! ¡Esto es exactamente lo que estaba buscando y precisamente al nivel de detalle que necesitaba! –

+0

@WaltStoneburner: de nada. Solo estaba explorando el soporte WKT de OpenLayers. :-) – Martijn

17

En mi otra respuesta, fui con WKT porque usted lo mencionó. Ahora veo que parece preferir GeoJSON.

Para convertir una capa de vector o un objeto Openlayers.Geometry a una cadena GeoJSON, se debe utilizar la función OpenLayers.Format.GeoJSON.write:

var geoJSON = new OpenLayers.Format.GeoJSON(), 
    geoJSONText = geoJSON.write(geometryObject); 

en cuenta que debe ser capaz de pasar el objeto a esta función, ya que (según documentación) acepta OpenLayers.Feature.Vector, así como OpenLayers.Geometry o un conjunto de características.

Por el contrario, cuando se tiene una cadena GeoJSON, puede convertir ese nuevo a un objeto utilizando la función OpenLayers.Format.GeoJSON.read:

var geometry = geoJSON.read(geoJSONText, 'Geometry'); 

El segundo parámetro le permite indicar qué tipo de objeto que le gustaría que volverá . Lea los documentos vinculados para obtener más información.

Además, eche un vistazo a this demo para obtener un ejemplo más extenso. (Vea la fuente de la página para ver cómo lo están haciendo).

+0

Excelente seguimiento! Esto es brillante. –

+1

@WaltStoneburner: Acepto, OpenLayers _is_ brilliant. Solo un poco documentado. – Martijn

+0

Nota para los que siguen, en realidad tuve que hacer esto: var geoJSON = new OpenLayers.Format.GeoJSON(). Write (geometryObject); –

Cuestiones relacionadas