Json – Saving and restoring geometries in OpenLayers

geojsongeospatialjsonopenlayerspersistence

Context: I'm a just-hours-old newbie at OpenLayers, please be gentle.

Fundamentally, I have a map with some drawn objects on it. If I understand things correctly, I have a number of OpenLayer.Feature.Vector (layers?) with a number of OpenLayer.Geometry "things" (like LinearRing) on it.

At the moment, I seem to be able to get a nice representation of the geometry, using .toString(). Yes, I suspect I'm doing it wrong — feel free to point me in the right direction.

This yields a very human readable, and database storable, strings such as:

  • 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)

Is there an inverse way of getting these back into the object format from whence they came?

I'd love to be using JSON, but can't seem to get GeoJSON to accept my OpenLayer.Feature.Vector object (which is what the CLASS_NAME property says it is when I peer inside).

Many thanks.

Best Answer

The Openlayers.Geometry objects’ toString method converts them nicely to WKT (Well-Known Text). If you use a GIS layer on top of your database (like PostGIS for PostGres, SQL Spatial for SQL Server, Spatialite for SQLite, etc.), they should offer functions that enable you to process WKT.

But if you want to convert that WKT to a new Openlayers.Geometry object (in the browser), you can use the fromWKT function:

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

Here, the variable point will now contain a new Openlayers.Geometry object, which has the same properties as the original one you used toString() on.

If you pass an array to the fromWKT function, it will return a GeometryCollection containing all the generated geometries.

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);

After this, collection.toString() should yield the following:

GEOMETRYCOLLECTION(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))