Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Saving and restoring geometries in OpenLayers

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.

like image 534
Walt Stoneburner Avatar asked Mar 04 '11 05:03

Walt Stoneburner


1 Answers

In my other answer, I went with WKT because you mentioned it. I now see that you seem to prefer GeoJSON.

To convert a vector layer or an Openlayers.Geometry object to a GeoJSON string, you should use the OpenLayers.Format.GeoJSON.write function:

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

Note that you should be able to pass your object to this function, since (according to documentation) it accepts an OpenLayers.Feature.Vector as well as a OpenLayers.Geometry or an array of features.

Conversely, when you’ve got a GeoJSON string, you can convert that back to an object using the OpenLayers.Format.GeoJSON.read function:

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

The second parameter lets you indicate which type of object you’d like returned. Read the docs linked to for more information.

Also, take a look at this demo for a more extensive example. (View the source of the page to see how they’re doing it).

like image 64
Martijn Avatar answered Oct 17 '22 00:10

Martijn