gpt4 book ai didi

leaflet - 更新 geojson 的属性以将其与传单一起使用

转载 作者:行者123 更新时间:2023-12-02 00:56:20 28 4
gpt4 key购买 nike

我需要使用 leaflet.js 将 map 添加到我的站点。该网站有一个管理 View ,管理员可以在其中添加标记并为每个标记添加描述和图像。

我使用了 leaflet.draw 插件,在创建事件中我尝试更新我使用 event.layer.toGeoJSON() 获得的 GeoJSON 对象以添加一些属性,例如图像和文本,但是没有运气。

谁能帮我解决这个问题?

var osmUrl = 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
osmAttrib = '&copy; <a href="http://openstreetmap.org/copyright">OpenStreetMap</a> contributors',
osm = L.tileLayer(osmUrl, {
maxZoom: 18,
attribution: osmAttrib
});

map = new L.Map('map', {
layers: [osm],
center: new L.LatLng(31.9500, 35.9333),
zoom: 15
}),
drawnItems = L.geoJson().addTo(map);
map.addControl(new L.Control.Draw({
edit: {
featureGroup: drawnItems
}
}));

map.on('draw:created', function(event) {
var layer = event.layer;
var json = event.layer.toGeoJSON();
json.properties.desc = null;
json.properties.image = null;
drawnItems.addLayer(L.GeoJSON.geometryToLayer(json));
addPopup(layer);
});

function addPopup(layer) {
var content = '<input id="markerDesc" type="text"/ onblur="saveData(layer);">';
layer.bindPopup(content).openPopup();
alert('out');
}

function saveData(layer) {
var markerDesc = $('#markerDesc').val();
var json = layer.toGeoJSON();
json.feature.properties.desc = markerDesc;
}

最佳答案

您的 "draw:created" 监听器无需转换为 GeoJSON 然后再返回到图层。

顺便说一句,然后您将弹出窗口添加到 layer 而您不对其进行任何操作,因为您将其转换为 GeoJSON 数据并从该数据创建了一个新层。

只需创建以下结构,以便稍后可以将存储的数据转换为 GeoJSON(如果您需要该功能):layer.feature.type = "Feature" layer.feature.properties.

var osmUrl = 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
osmAttrib = '&copy; <a href="http://openstreetmap.org/copyright">OpenStreetMap</a> contributors',
osm = L.tileLayer(osmUrl, {
maxZoom: 18,
attribution: osmAttrib
});

map = L.map('map', {
layers: [osm],
center: [31.9500, 35.9333],
zoom: 15
});
var drawnItems = L.geoJson().addTo(map);
map.addControl(new L.Control.Draw({
edit: {
featureGroup: drawnItems
}
}));

map.on('draw:created', function (event) {
var layer = event.layer,
feature = layer.feature = layer.feature || {};

feature.type = feature.type || "Feature";
var props = feature.properties = feature.properties || {};
props.desc = null;
props.image = null;
drawnItems.addLayer(layer);
addPopup(layer);
});

function addPopup(layer) {
var content = document.createElement("textarea");
content.addEventListener("keyup", function () {
layer.feature.properties.desc = content.value;
});
layer.on("popupopen", function () {
content.value = layer.feature.properties.desc;
content.focus();
});
layer.bindPopup(content).openPopup();
}

演示:https://jsfiddle.net/ve2huzxw/314/

已编辑:以前的代码实际上并没有很好地实现 GeoJSON properties 功能(保存在 geometry 而不是 feature,由于缺少 layer.feature.type = "Feature",另请参阅 Leaflet Draw not taking properties when converting FeatureGroup to GeoJson )

关于leaflet - 更新 geojson 的属性以将其与传单一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34738805/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com