Making a GeoJSON layer editable with the Leaflet.Editable pluginAdding GeoJSON layer Leaflet map?Leaflet SVG...

What does it exactly mean if a random variable follows a distribution

Why is the design of haulage companies so “special”?

Denied boarding due to overcrowding, Sparpreis ticket. What are my rights?

Lied on resume at previous job

I see my dog run

Is it legal to have the "// (c) 2019 John Smith" header in all files when there are hundreds of contributors?

Is it wise to focus on putting odd beats on left when playing double bass drums?

Are cabin dividers used to "hide" the flex of the airplane?

Landlord wants to switch my lease to a "Land contract" to "get back at the city"

Unbreakable Formation vs. Cry of the Carnarium

Why doesn't a const reference extend the life of a temporary object passed via a function?

How to move the player while also allowing forces to affect it

Symmetry in quantum mechanics

aging parents with no investments

Where else does the Shulchan Aruch quote an authority by name?

Are white and non-white police officers equally likely to kill black suspects?

How can I fix this gap between bookcases I made?

What is the meaning of "of trouble" in the following sentence?

extract characters between two commas?

What do you call words made from common English words?

Hosting Wordpress in a EC2 Load Balanced Instance

How to make payment on the internet without leaving a money trail?

Doomsday-clock for my fantasy planet

Are objects structures and/or vice versa?



Making a GeoJSON layer editable with the Leaflet.Editable plugin


Adding GeoJSON layer Leaflet map?Leaflet SVG layer is obscuring the underlying GeoJSON interactivityFormating GeoJSON file with Leaflet Ajax-pluginHow to add GeoJSON layer with GraphHopper?Use a global GeoJSON layer in LeafletMarkerCluster don't work with geojson layer in leafletHow do I create a geoJSON layer with a div icon instead of the leaflet standard icon?Marker differently depending on the tool with Leaflet.EditableMake GeoJSON easily editableUsing Leaflet Search plugin with GeoJSON layer (L.Control.Search)






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}







3















I'm new to Leaflet and the Leaflet.Editable plugin, but I'd like to make GeoJSON layer editable. When I mean "editable", I mean a user can stretch the polygons at will.



Here is a good example of what I'd like.



My current code is as follows:



var map = L.map('mapid', {editable: true}).setView([39.08344, -77.6497145], 13);

L.tileLayer('Some Valid Tile Layer',
{
attribution: 'Myself',
maxZoom: 18
}).addTo(map);

$.ajax({

url: 'http://127.0.0.1:8000/static/map/geoJSON/elementary_boundaries.geojson',
dataType: 'json',
success: function(data){

console.log('The data was received');
L.geoJson(data, {

onEachFeature: function(feature, layer){
layer.enableEdit(); // incorrect, but code would go here

}
}).addTo(map);

},

failure: function(data){
console.log('The data wasn't received');
}

});


I don't fully understand features vs layers, and I fully don't understand leaflet's geometry construction flow, so I'm sure my problem is elementary.










share|improve this question































    3















    I'm new to Leaflet and the Leaflet.Editable plugin, but I'd like to make GeoJSON layer editable. When I mean "editable", I mean a user can stretch the polygons at will.



    Here is a good example of what I'd like.



    My current code is as follows:



    var map = L.map('mapid', {editable: true}).setView([39.08344, -77.6497145], 13);

    L.tileLayer('Some Valid Tile Layer',
    {
    attribution: 'Myself',
    maxZoom: 18
    }).addTo(map);

    $.ajax({

    url: 'http://127.0.0.1:8000/static/map/geoJSON/elementary_boundaries.geojson',
    dataType: 'json',
    success: function(data){

    console.log('The data was received');
    L.geoJson(data, {

    onEachFeature: function(feature, layer){
    layer.enableEdit(); // incorrect, but code would go here

    }
    }).addTo(map);

    },

    failure: function(data){
    console.log('The data wasn't received');
    }

    });


    I don't fully understand features vs layers, and I fully don't understand leaflet's geometry construction flow, so I'm sure my problem is elementary.










    share|improve this question



























      3












      3








      3








      I'm new to Leaflet and the Leaflet.Editable plugin, but I'd like to make GeoJSON layer editable. When I mean "editable", I mean a user can stretch the polygons at will.



      Here is a good example of what I'd like.



      My current code is as follows:



      var map = L.map('mapid', {editable: true}).setView([39.08344, -77.6497145], 13);

      L.tileLayer('Some Valid Tile Layer',
      {
      attribution: 'Myself',
      maxZoom: 18
      }).addTo(map);

      $.ajax({

      url: 'http://127.0.0.1:8000/static/map/geoJSON/elementary_boundaries.geojson',
      dataType: 'json',
      success: function(data){

      console.log('The data was received');
      L.geoJson(data, {

      onEachFeature: function(feature, layer){
      layer.enableEdit(); // incorrect, but code would go here

      }
      }).addTo(map);

      },

      failure: function(data){
      console.log('The data wasn't received');
      }

      });


      I don't fully understand features vs layers, and I fully don't understand leaflet's geometry construction flow, so I'm sure my problem is elementary.










      share|improve this question
















      I'm new to Leaflet and the Leaflet.Editable plugin, but I'd like to make GeoJSON layer editable. When I mean "editable", I mean a user can stretch the polygons at will.



      Here is a good example of what I'd like.



      My current code is as follows:



      var map = L.map('mapid', {editable: true}).setView([39.08344, -77.6497145], 13);

      L.tileLayer('Some Valid Tile Layer',
      {
      attribution: 'Myself',
      maxZoom: 18
      }).addTo(map);

      $.ajax({

      url: 'http://127.0.0.1:8000/static/map/geoJSON/elementary_boundaries.geojson',
      dataType: 'json',
      success: function(data){

      console.log('The data was received');
      L.geoJson(data, {

      onEachFeature: function(feature, layer){
      layer.enableEdit(); // incorrect, but code would go here

      }
      }).addTo(map);

      },

      failure: function(data){
      console.log('The data wasn't received');
      }

      });


      I don't fully understand features vs layers, and I fully don't understand leaflet's geometry construction flow, so I'm sure my problem is elementary.







      leaflet geojson






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Apr 18 '17 at 21:56









      PolyGeo

      53.9k1781245




      53.9k1781245










      asked Apr 18 '17 at 15:12









      Obelisk47Obelisk47

      164




      164






















          3 Answers
          3






          active

          oldest

          votes


















          1














          Try this as your success callback from the $.ajax call:



          success: function(data){
          console.log('The data was received');
          var layer = L.GeoJSON.geometryToLayer(data);
          layer.addTo(map);
          layer.enableEdit();
          }





          share|improve this answer
























          • That's for responding, but when I tried your code it didn't work. I got the following error: Uncaught Error: Invalid GeoJSON object.

            – Obelisk47
            Apr 19 '17 at 14:09













          • not sure, it worked for me with this: { "type": "Feature", "properties": { "name": "Bermuda Triangle", "area": 1150180 }, "geometry": { "type": "Polygon", "coordinates": [ [ [-64.73, 32.31], [-80.19, 25.76], [-66.09, 18.43], [-64.73, 32.31] ] ] } }

            – toms
            Apr 19 '17 at 15:32













          • can you console.log your data, and then check that it is valid using GeoJSON lint

            – toms
            Apr 19 '17 at 15:33











          • also you might find some of the discussion in this issue helpful. Different Leaflet plugin, but same issue

            – toms
            Apr 19 '17 at 15:35











          • My GeoJSON file is about 3 MB and it isn't formatted "nicely". Most validators I find reject it for its size. The link you sent me gave me three outputs: Line 2: Polygons and MultiPolygons should follow the right-hand rule, Line 2: a LinearRing of coordinates needs to have four or more positions, Line 2: old-style crs member is not recommended, this object is equivalent to the default and should be removed. I believe these are irrelevant. The GeoJSON file renders correct and looks like expected, so I know the file is correct.

            – Obelisk47
            Apr 19 '17 at 15:57



















          0














          I fixed my problem, though I'm not sure if my solution is the most "ideal" way.



          I'm going to give some insight into what I learned and some of this may be wrong, so please let me know so this post can be as accurate as possible.



          The Leaflet.Editable plugin only works consistently with Leaflet Vector Layers. These are the classes of Polyline, Polygon, Rectangle, Circle, and Marker. When you use L.GeoJSON, you're creating a different kind of Layer.



          The solution is to read the GeoJSON file and instead of making a GeoJSON layer, make a Layer of the Vector variety.



          The GeoJSON I used had a type of FeatureCollection. So parse the file and covert each feature into a Polygon class. The code is below



          var map = L.map('mapid', {editable: true}).setView([39.08344, -77.6497145], 13);

          L.tileLayer('A Valid Tile Layer',
          {
          attribution: 'Myself',
          maxZoom: 18
          }).addTo(map);

          $.ajax({

          url: 'http://127.0.0.1:8000/static/map/geoJSON/elementary_boundaries.geojson',
          dataType: 'json',
          success: function(data){

          var latLong = [];
          var thisTime = true;
          data.features.forEach(function(currentFeature){

          currentFeature.geometry.coordinates[0].forEach(function(locationArray){

          locationArray.forEach(function(location){

          latLong.push([location[1] , location[0]]);
          });
          });

          var polygon = L.polygon(latLong).addTo(map);
          polygon.enableEdit();
          latLong = [];
          });
          },

          failure: function(data){
          console.log('The data wasn't received');
          }

          });


          The following part is necessary because GeoJSON specification requires that coordinates to be in [longitude, latitude] and Leaflet (or OpenStreetMap, can't remember) requires [latitude, and longitude]



              currentFeature.geometry.coordinates[0].forEach(function(locationArray){

          locationArray.forEach(function(location){

          latLong.push([location[1] , location[0]]);
          });
          });


          I had a GeoJSON file of over 250,000 lines, so maybe the plugin works differently for large files, but this solution solved my problem.






          share|improve this answer































            0














            For future searchers, an alternative solution is to catch the 'edited' event from the editable extension and update the GeoJSON geometry to match that of the layer:



             this.mapHost.map.on('editable:vertex:dragend', (event: any) =>
            {
            // Note: the layer latlngs have been updated here but not the geojson geometry
            // copy changes to geojson
            event.layer.feature.geometry = (event.layer as any).toGeoJSON().geometry;
            });





            share|improve this answer










            New contributor




            Geoff Mc is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.





















              Your Answer








              StackExchange.ready(function() {
              var channelOptions = {
              tags: "".split(" "),
              id: "79"
              };
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function() {
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled) {
              StackExchange.using("snippets", function() {
              createEditor();
              });
              }
              else {
              createEditor();
              }
              });

              function createEditor() {
              StackExchange.prepareEditor({
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: false,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: null,
              bindNavPrevention: true,
              postfix: "",
              imageUploader: {
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              },
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              });


              }
              });














              draft saved

              draft discarded


















              StackExchange.ready(
              function () {
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fgis.stackexchange.com%2fquestions%2f237171%2fmaking-a-geojson-layer-editable-with-the-leaflet-editable-plugin%23new-answer', 'question_page');
              }
              );

              Post as a guest















              Required, but never shown

























              3 Answers
              3






              active

              oldest

              votes








              3 Answers
              3






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              1














              Try this as your success callback from the $.ajax call:



              success: function(data){
              console.log('The data was received');
              var layer = L.GeoJSON.geometryToLayer(data);
              layer.addTo(map);
              layer.enableEdit();
              }





              share|improve this answer
























              • That's for responding, but when I tried your code it didn't work. I got the following error: Uncaught Error: Invalid GeoJSON object.

                – Obelisk47
                Apr 19 '17 at 14:09













              • not sure, it worked for me with this: { "type": "Feature", "properties": { "name": "Bermuda Triangle", "area": 1150180 }, "geometry": { "type": "Polygon", "coordinates": [ [ [-64.73, 32.31], [-80.19, 25.76], [-66.09, 18.43], [-64.73, 32.31] ] ] } }

                – toms
                Apr 19 '17 at 15:32













              • can you console.log your data, and then check that it is valid using GeoJSON lint

                – toms
                Apr 19 '17 at 15:33











              • also you might find some of the discussion in this issue helpful. Different Leaflet plugin, but same issue

                – toms
                Apr 19 '17 at 15:35











              • My GeoJSON file is about 3 MB and it isn't formatted "nicely". Most validators I find reject it for its size. The link you sent me gave me three outputs: Line 2: Polygons and MultiPolygons should follow the right-hand rule, Line 2: a LinearRing of coordinates needs to have four or more positions, Line 2: old-style crs member is not recommended, this object is equivalent to the default and should be removed. I believe these are irrelevant. The GeoJSON file renders correct and looks like expected, so I know the file is correct.

                – Obelisk47
                Apr 19 '17 at 15:57
















              1














              Try this as your success callback from the $.ajax call:



              success: function(data){
              console.log('The data was received');
              var layer = L.GeoJSON.geometryToLayer(data);
              layer.addTo(map);
              layer.enableEdit();
              }





              share|improve this answer
























              • That's for responding, but when I tried your code it didn't work. I got the following error: Uncaught Error: Invalid GeoJSON object.

                – Obelisk47
                Apr 19 '17 at 14:09













              • not sure, it worked for me with this: { "type": "Feature", "properties": { "name": "Bermuda Triangle", "area": 1150180 }, "geometry": { "type": "Polygon", "coordinates": [ [ [-64.73, 32.31], [-80.19, 25.76], [-66.09, 18.43], [-64.73, 32.31] ] ] } }

                – toms
                Apr 19 '17 at 15:32













              • can you console.log your data, and then check that it is valid using GeoJSON lint

                – toms
                Apr 19 '17 at 15:33











              • also you might find some of the discussion in this issue helpful. Different Leaflet plugin, but same issue

                – toms
                Apr 19 '17 at 15:35











              • My GeoJSON file is about 3 MB and it isn't formatted "nicely". Most validators I find reject it for its size. The link you sent me gave me three outputs: Line 2: Polygons and MultiPolygons should follow the right-hand rule, Line 2: a LinearRing of coordinates needs to have four or more positions, Line 2: old-style crs member is not recommended, this object is equivalent to the default and should be removed. I believe these are irrelevant. The GeoJSON file renders correct and looks like expected, so I know the file is correct.

                – Obelisk47
                Apr 19 '17 at 15:57














              1












              1








              1







              Try this as your success callback from the $.ajax call:



              success: function(data){
              console.log('The data was received');
              var layer = L.GeoJSON.geometryToLayer(data);
              layer.addTo(map);
              layer.enableEdit();
              }





              share|improve this answer













              Try this as your success callback from the $.ajax call:



              success: function(data){
              console.log('The data was received');
              var layer = L.GeoJSON.geometryToLayer(data);
              layer.addTo(map);
              layer.enableEdit();
              }






              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered Apr 19 '17 at 4:20









              tomstoms

              5,30711222




              5,30711222













              • That's for responding, but when I tried your code it didn't work. I got the following error: Uncaught Error: Invalid GeoJSON object.

                – Obelisk47
                Apr 19 '17 at 14:09













              • not sure, it worked for me with this: { "type": "Feature", "properties": { "name": "Bermuda Triangle", "area": 1150180 }, "geometry": { "type": "Polygon", "coordinates": [ [ [-64.73, 32.31], [-80.19, 25.76], [-66.09, 18.43], [-64.73, 32.31] ] ] } }

                – toms
                Apr 19 '17 at 15:32













              • can you console.log your data, and then check that it is valid using GeoJSON lint

                – toms
                Apr 19 '17 at 15:33











              • also you might find some of the discussion in this issue helpful. Different Leaflet plugin, but same issue

                – toms
                Apr 19 '17 at 15:35











              • My GeoJSON file is about 3 MB and it isn't formatted "nicely". Most validators I find reject it for its size. The link you sent me gave me three outputs: Line 2: Polygons and MultiPolygons should follow the right-hand rule, Line 2: a LinearRing of coordinates needs to have four or more positions, Line 2: old-style crs member is not recommended, this object is equivalent to the default and should be removed. I believe these are irrelevant. The GeoJSON file renders correct and looks like expected, so I know the file is correct.

                – Obelisk47
                Apr 19 '17 at 15:57



















              • That's for responding, but when I tried your code it didn't work. I got the following error: Uncaught Error: Invalid GeoJSON object.

                – Obelisk47
                Apr 19 '17 at 14:09













              • not sure, it worked for me with this: { "type": "Feature", "properties": { "name": "Bermuda Triangle", "area": 1150180 }, "geometry": { "type": "Polygon", "coordinates": [ [ [-64.73, 32.31], [-80.19, 25.76], [-66.09, 18.43], [-64.73, 32.31] ] ] } }

                – toms
                Apr 19 '17 at 15:32













              • can you console.log your data, and then check that it is valid using GeoJSON lint

                – toms
                Apr 19 '17 at 15:33











              • also you might find some of the discussion in this issue helpful. Different Leaflet plugin, but same issue

                – toms
                Apr 19 '17 at 15:35











              • My GeoJSON file is about 3 MB and it isn't formatted "nicely". Most validators I find reject it for its size. The link you sent me gave me three outputs: Line 2: Polygons and MultiPolygons should follow the right-hand rule, Line 2: a LinearRing of coordinates needs to have four or more positions, Line 2: old-style crs member is not recommended, this object is equivalent to the default and should be removed. I believe these are irrelevant. The GeoJSON file renders correct and looks like expected, so I know the file is correct.

                – Obelisk47
                Apr 19 '17 at 15:57

















              That's for responding, but when I tried your code it didn't work. I got the following error: Uncaught Error: Invalid GeoJSON object.

              – Obelisk47
              Apr 19 '17 at 14:09







              That's for responding, but when I tried your code it didn't work. I got the following error: Uncaught Error: Invalid GeoJSON object.

              – Obelisk47
              Apr 19 '17 at 14:09















              not sure, it worked for me with this: { "type": "Feature", "properties": { "name": "Bermuda Triangle", "area": 1150180 }, "geometry": { "type": "Polygon", "coordinates": [ [ [-64.73, 32.31], [-80.19, 25.76], [-66.09, 18.43], [-64.73, 32.31] ] ] } }

              – toms
              Apr 19 '17 at 15:32







              not sure, it worked for me with this: { "type": "Feature", "properties": { "name": "Bermuda Triangle", "area": 1150180 }, "geometry": { "type": "Polygon", "coordinates": [ [ [-64.73, 32.31], [-80.19, 25.76], [-66.09, 18.43], [-64.73, 32.31] ] ] } }

              – toms
              Apr 19 '17 at 15:32















              can you console.log your data, and then check that it is valid using GeoJSON lint

              – toms
              Apr 19 '17 at 15:33





              can you console.log your data, and then check that it is valid using GeoJSON lint

              – toms
              Apr 19 '17 at 15:33













              also you might find some of the discussion in this issue helpful. Different Leaflet plugin, but same issue

              – toms
              Apr 19 '17 at 15:35





              also you might find some of the discussion in this issue helpful. Different Leaflet plugin, but same issue

              – toms
              Apr 19 '17 at 15:35













              My GeoJSON file is about 3 MB and it isn't formatted "nicely". Most validators I find reject it for its size. The link you sent me gave me three outputs: Line 2: Polygons and MultiPolygons should follow the right-hand rule, Line 2: a LinearRing of coordinates needs to have four or more positions, Line 2: old-style crs member is not recommended, this object is equivalent to the default and should be removed. I believe these are irrelevant. The GeoJSON file renders correct and looks like expected, so I know the file is correct.

              – Obelisk47
              Apr 19 '17 at 15:57





              My GeoJSON file is about 3 MB and it isn't formatted "nicely". Most validators I find reject it for its size. The link you sent me gave me three outputs: Line 2: Polygons and MultiPolygons should follow the right-hand rule, Line 2: a LinearRing of coordinates needs to have four or more positions, Line 2: old-style crs member is not recommended, this object is equivalent to the default and should be removed. I believe these are irrelevant. The GeoJSON file renders correct and looks like expected, so I know the file is correct.

              – Obelisk47
              Apr 19 '17 at 15:57













              0














              I fixed my problem, though I'm not sure if my solution is the most "ideal" way.



              I'm going to give some insight into what I learned and some of this may be wrong, so please let me know so this post can be as accurate as possible.



              The Leaflet.Editable plugin only works consistently with Leaflet Vector Layers. These are the classes of Polyline, Polygon, Rectangle, Circle, and Marker. When you use L.GeoJSON, you're creating a different kind of Layer.



              The solution is to read the GeoJSON file and instead of making a GeoJSON layer, make a Layer of the Vector variety.



              The GeoJSON I used had a type of FeatureCollection. So parse the file and covert each feature into a Polygon class. The code is below



              var map = L.map('mapid', {editable: true}).setView([39.08344, -77.6497145], 13);

              L.tileLayer('A Valid Tile Layer',
              {
              attribution: 'Myself',
              maxZoom: 18
              }).addTo(map);

              $.ajax({

              url: 'http://127.0.0.1:8000/static/map/geoJSON/elementary_boundaries.geojson',
              dataType: 'json',
              success: function(data){

              var latLong = [];
              var thisTime = true;
              data.features.forEach(function(currentFeature){

              currentFeature.geometry.coordinates[0].forEach(function(locationArray){

              locationArray.forEach(function(location){

              latLong.push([location[1] , location[0]]);
              });
              });

              var polygon = L.polygon(latLong).addTo(map);
              polygon.enableEdit();
              latLong = [];
              });
              },

              failure: function(data){
              console.log('The data wasn't received');
              }

              });


              The following part is necessary because GeoJSON specification requires that coordinates to be in [longitude, latitude] and Leaflet (or OpenStreetMap, can't remember) requires [latitude, and longitude]



                  currentFeature.geometry.coordinates[0].forEach(function(locationArray){

              locationArray.forEach(function(location){

              latLong.push([location[1] , location[0]]);
              });
              });


              I had a GeoJSON file of over 250,000 lines, so maybe the plugin works differently for large files, but this solution solved my problem.






              share|improve this answer




























                0














                I fixed my problem, though I'm not sure if my solution is the most "ideal" way.



                I'm going to give some insight into what I learned and some of this may be wrong, so please let me know so this post can be as accurate as possible.



                The Leaflet.Editable plugin only works consistently with Leaflet Vector Layers. These are the classes of Polyline, Polygon, Rectangle, Circle, and Marker. When you use L.GeoJSON, you're creating a different kind of Layer.



                The solution is to read the GeoJSON file and instead of making a GeoJSON layer, make a Layer of the Vector variety.



                The GeoJSON I used had a type of FeatureCollection. So parse the file and covert each feature into a Polygon class. The code is below



                var map = L.map('mapid', {editable: true}).setView([39.08344, -77.6497145], 13);

                L.tileLayer('A Valid Tile Layer',
                {
                attribution: 'Myself',
                maxZoom: 18
                }).addTo(map);

                $.ajax({

                url: 'http://127.0.0.1:8000/static/map/geoJSON/elementary_boundaries.geojson',
                dataType: 'json',
                success: function(data){

                var latLong = [];
                var thisTime = true;
                data.features.forEach(function(currentFeature){

                currentFeature.geometry.coordinates[0].forEach(function(locationArray){

                locationArray.forEach(function(location){

                latLong.push([location[1] , location[0]]);
                });
                });

                var polygon = L.polygon(latLong).addTo(map);
                polygon.enableEdit();
                latLong = [];
                });
                },

                failure: function(data){
                console.log('The data wasn't received');
                }

                });


                The following part is necessary because GeoJSON specification requires that coordinates to be in [longitude, latitude] and Leaflet (or OpenStreetMap, can't remember) requires [latitude, and longitude]



                    currentFeature.geometry.coordinates[0].forEach(function(locationArray){

                locationArray.forEach(function(location){

                latLong.push([location[1] , location[0]]);
                });
                });


                I had a GeoJSON file of over 250,000 lines, so maybe the plugin works differently for large files, but this solution solved my problem.






                share|improve this answer


























                  0












                  0








                  0







                  I fixed my problem, though I'm not sure if my solution is the most "ideal" way.



                  I'm going to give some insight into what I learned and some of this may be wrong, so please let me know so this post can be as accurate as possible.



                  The Leaflet.Editable plugin only works consistently with Leaflet Vector Layers. These are the classes of Polyline, Polygon, Rectangle, Circle, and Marker. When you use L.GeoJSON, you're creating a different kind of Layer.



                  The solution is to read the GeoJSON file and instead of making a GeoJSON layer, make a Layer of the Vector variety.



                  The GeoJSON I used had a type of FeatureCollection. So parse the file and covert each feature into a Polygon class. The code is below



                  var map = L.map('mapid', {editable: true}).setView([39.08344, -77.6497145], 13);

                  L.tileLayer('A Valid Tile Layer',
                  {
                  attribution: 'Myself',
                  maxZoom: 18
                  }).addTo(map);

                  $.ajax({

                  url: 'http://127.0.0.1:8000/static/map/geoJSON/elementary_boundaries.geojson',
                  dataType: 'json',
                  success: function(data){

                  var latLong = [];
                  var thisTime = true;
                  data.features.forEach(function(currentFeature){

                  currentFeature.geometry.coordinates[0].forEach(function(locationArray){

                  locationArray.forEach(function(location){

                  latLong.push([location[1] , location[0]]);
                  });
                  });

                  var polygon = L.polygon(latLong).addTo(map);
                  polygon.enableEdit();
                  latLong = [];
                  });
                  },

                  failure: function(data){
                  console.log('The data wasn't received');
                  }

                  });


                  The following part is necessary because GeoJSON specification requires that coordinates to be in [longitude, latitude] and Leaflet (or OpenStreetMap, can't remember) requires [latitude, and longitude]



                      currentFeature.geometry.coordinates[0].forEach(function(locationArray){

                  locationArray.forEach(function(location){

                  latLong.push([location[1] , location[0]]);
                  });
                  });


                  I had a GeoJSON file of over 250,000 lines, so maybe the plugin works differently for large files, but this solution solved my problem.






                  share|improve this answer













                  I fixed my problem, though I'm not sure if my solution is the most "ideal" way.



                  I'm going to give some insight into what I learned and some of this may be wrong, so please let me know so this post can be as accurate as possible.



                  The Leaflet.Editable plugin only works consistently with Leaflet Vector Layers. These are the classes of Polyline, Polygon, Rectangle, Circle, and Marker. When you use L.GeoJSON, you're creating a different kind of Layer.



                  The solution is to read the GeoJSON file and instead of making a GeoJSON layer, make a Layer of the Vector variety.



                  The GeoJSON I used had a type of FeatureCollection. So parse the file and covert each feature into a Polygon class. The code is below



                  var map = L.map('mapid', {editable: true}).setView([39.08344, -77.6497145], 13);

                  L.tileLayer('A Valid Tile Layer',
                  {
                  attribution: 'Myself',
                  maxZoom: 18
                  }).addTo(map);

                  $.ajax({

                  url: 'http://127.0.0.1:8000/static/map/geoJSON/elementary_boundaries.geojson',
                  dataType: 'json',
                  success: function(data){

                  var latLong = [];
                  var thisTime = true;
                  data.features.forEach(function(currentFeature){

                  currentFeature.geometry.coordinates[0].forEach(function(locationArray){

                  locationArray.forEach(function(location){

                  latLong.push([location[1] , location[0]]);
                  });
                  });

                  var polygon = L.polygon(latLong).addTo(map);
                  polygon.enableEdit();
                  latLong = [];
                  });
                  },

                  failure: function(data){
                  console.log('The data wasn't received');
                  }

                  });


                  The following part is necessary because GeoJSON specification requires that coordinates to be in [longitude, latitude] and Leaflet (or OpenStreetMap, can't remember) requires [latitude, and longitude]



                      currentFeature.geometry.coordinates[0].forEach(function(locationArray){

                  locationArray.forEach(function(location){

                  latLong.push([location[1] , location[0]]);
                  });
                  });


                  I had a GeoJSON file of over 250,000 lines, so maybe the plugin works differently for large files, but this solution solved my problem.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Apr 20 '17 at 21:19









                  Obelisk47Obelisk47

                  164




                  164























                      0














                      For future searchers, an alternative solution is to catch the 'edited' event from the editable extension and update the GeoJSON geometry to match that of the layer:



                       this.mapHost.map.on('editable:vertex:dragend', (event: any) =>
                      {
                      // Note: the layer latlngs have been updated here but not the geojson geometry
                      // copy changes to geojson
                      event.layer.feature.geometry = (event.layer as any).toGeoJSON().geometry;
                      });





                      share|improve this answer










                      New contributor




                      Geoff Mc is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                      Check out our Code of Conduct.

























                        0














                        For future searchers, an alternative solution is to catch the 'edited' event from the editable extension and update the GeoJSON geometry to match that of the layer:



                         this.mapHost.map.on('editable:vertex:dragend', (event: any) =>
                        {
                        // Note: the layer latlngs have been updated here but not the geojson geometry
                        // copy changes to geojson
                        event.layer.feature.geometry = (event.layer as any).toGeoJSON().geometry;
                        });





                        share|improve this answer










                        New contributor




                        Geoff Mc is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                        Check out our Code of Conduct.























                          0












                          0








                          0







                          For future searchers, an alternative solution is to catch the 'edited' event from the editable extension and update the GeoJSON geometry to match that of the layer:



                           this.mapHost.map.on('editable:vertex:dragend', (event: any) =>
                          {
                          // Note: the layer latlngs have been updated here but not the geojson geometry
                          // copy changes to geojson
                          event.layer.feature.geometry = (event.layer as any).toGeoJSON().geometry;
                          });





                          share|improve this answer










                          New contributor




                          Geoff Mc is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                          Check out our Code of Conduct.










                          For future searchers, an alternative solution is to catch the 'edited' event from the editable extension and update the GeoJSON geometry to match that of the layer:



                           this.mapHost.map.on('editable:vertex:dragend', (event: any) =>
                          {
                          // Note: the layer latlngs have been updated here but not the geojson geometry
                          // copy changes to geojson
                          event.layer.feature.geometry = (event.layer as any).toGeoJSON().geometry;
                          });






                          share|improve this answer










                          New contributor




                          Geoff Mc is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                          Check out our Code of Conduct.









                          share|improve this answer



                          share|improve this answer








                          edited 7 mins ago









                          Vince

                          14.8k32849




                          14.8k32849






                          New contributor




                          Geoff Mc is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                          Check out our Code of Conduct.









                          answered 34 mins ago









                          Geoff McGeoff Mc

                          1




                          1




                          New contributor




                          Geoff Mc is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                          Check out our Code of Conduct.





                          New contributor





                          Geoff Mc is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                          Check out our Code of Conduct.






                          Geoff Mc is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                          Check out our Code of Conduct.






























                              draft saved

                              draft discarded




















































                              Thanks for contributing an answer to Geographic Information Systems Stack Exchange!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid



                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.


                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function () {
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fgis.stackexchange.com%2fquestions%2f237171%2fmaking-a-geojson-layer-editable-with-the-leaflet-editable-plugin%23new-answer', 'question_page');
                              }
                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              Щит и меч (фильм) Содержание Названия серий | Сюжет |...

                              is 'sed' thread safeWhat should someone know about using Python scripts in the shell?Nexenta bash script uses...

                              Meter-Bus Содержание Параметры шины | Стандартизация |...