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;
}
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
add a comment |
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
add a comment |
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
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
leaflet geojson
edited Apr 18 '17 at 21:56
PolyGeo♦
53.9k1781245
53.9k1781245
asked Apr 18 '17 at 15:12
Obelisk47Obelisk47
164
164
add a comment |
add a comment |
3 Answers
3
active
oldest
votes
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();
}
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 youconsole.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
|
show 1 more comment
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.
add a comment |
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;
});
New contributor
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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();
}
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 youconsole.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
|
show 1 more comment
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();
}
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 youconsole.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
|
show 1 more comment
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();
}
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();
}
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 youconsole.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
|
show 1 more comment
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 youconsole.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
|
show 1 more comment
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.
add a comment |
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.
add a comment |
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.
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.
answered Apr 20 '17 at 21:19
Obelisk47Obelisk47
164
164
add a comment |
add a comment |
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;
});
New contributor
add a comment |
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;
});
New contributor
add a comment |
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;
});
New contributor
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;
});
New contributor
edited 7 mins ago
Vince
14.8k32849
14.8k32849
New contributor
answered 34 mins ago
Geoff McGeoff Mc
1
1
New contributor
New contributor
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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