Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Leaflet Draw not taking properties when converting FeatureGroup to GeoJson

I'm unable to convert my Layer properties into the properties of the GEOJson object using Leaflet(0.7.7)/Leaflet.Draw(latest). My workflow is:

1 Create Map: var map = L.map('#map', options);

2 Create a FeatureGroup: features= new L.FeatureGroup();

3 Add to the Leaflet Map: map.addLayer(features);

4 On the draw:created event, I'm capturing e.layer and adding a bunch of properties:

var layer = e.layer;

layer.properties = { Title: 'Hello' };

features.addLayer(layer);

geo_features = features.toGeoJSON();

However, my geo_features always have empty property attributes in each of the features and I can't figure it out!

like image 559
Chronix3 Avatar asked Mar 02 '16 23:03

Chronix3


2 Answers

iH8's initial answer was almost correct.

To specify properties that will appear in a vector layer's GeoJSON export (i.e. through its .toGeoJSON() method), you have to fill its feature.type and feature.properties members:

var myVectorLayer = L.rectangle(...) // whatever

var feature = myVectorLayer.feature = myVectorLayer.feature || {};
feature.type = "Feature";
feature.properties = feature.properties || {};
feature.properties["Foo"] = "Bar";

Now myVectorLayer.toGeoJSON() returns a valid GeoJSON feature object represented by:

{
  "type": "Feature",
  "properties": {
    "Foo": "Bar"
    // More properties that may be pre-filled.
  },
  "geometry": // The vector geometry
}
like image 121
ghybs Avatar answered Jan 04 '23 04:01

ghybs


A (kind of ugly workaround) is using a L.GeoJSON layer and add the drawn layer's GeoJSON to it by using it's addData method. Afterwards grab the last layer in the L.GeoJSON layer's _layers object. At that point the layer has a valid GeoJSON feature property you can edit:

var geojson = new L.GeoJSON().addTo(map);

var drawControl = new L.Control.Draw({
    edit: {
        featureGroup: geojson
    }
}).addTo(map);

map.on('draw:created', function (e) {

    geojson.addData(e.layer.toGeoJSON());

    var layers = geojson._layers,
        keys = Object.keys(layers),
        key = keys[keys.length - 1],
        layer = layers[key];

    layer.feature.properties = {
        'Foo': 'Bar'
    };
});
like image 36
iH8 Avatar answered Jan 04 '23 05:01

iH8