#javascript #leaflet #geojson
#javascript #брошюра #geojson
Вопрос:
Я пытаюсь использовать leaflet.js чтобы создать карту хороплета. Я начал с geojson стран и добавил дополнительную информацию из данных API. Geojson теперь выглядит так:
{
"type": "FeatureCollection",
"features": [
{ "type": "Feature", "properties": { "ADMIN": "Aruba", "ISO_A3": "ABW", "HW_COUNT": 0, "ISO_A2": "AW" }, "geometry": { "type": ...
И загружается в переменную combined_jsons
.
Этот код успешно загружает карту с geojson:
var mymap = L.map('mapid').setView([51.505, -0.09], 2);
L.geoJSON(combined_jsons).addTo(mymap)
К сожалению, у меня возникли проблемы со следующим шагом, который заключается в стилизации стран на основе HW_COUNT
.
Я использовал этот пример, чтобы попытаться правильно структурировать свой стиль с помощью этого кода:
L.geoJSON(combined_jsons, {
style: function(feature){
var fillColor,
hw_count = combined_jsons.features.properties.HW_COUNT;
if (hw_count > 5) fillColor = "#006837";
else if (hw_count > 0) fillColor = "#78c679";
else fillColor = "#f7f7f7";
return { color: "#999", weight: 1, fillColor: fillColor, fillOpacity: .6 };
}
} ).addTo(mymap);
Это возвращает Uncaught TypeError: combined_jsons.features.properties is undefined
ошибку. Я могу успешно console.log(combined_jsons.features[0].properties.HW_COUNT);
, но добавление [0]
, похоже, противоречит смыслу стиля, который, как я полагаю, повторяется через каждый элемент?
Есть ли лучший способ структурирования этого слоя?
Спасибо
Комментарии:
1. Обратный
style
вызов принимает afeature
, а не целоеFeatureCollection
.L.GeoJSON
перебирает каждыйFeature
изFeatureCollection
них для вас. Итак, в основном вы хотите использоватьfeature.properties.HW_COUNT
вместоcombined_jsons.features[i].properties.HW_COUNT
, посколькуstyle()
будет вызываться много раз, иfeature
аргумент будет принимать значениеcombined_jsons.features[i]
для каждого возможногоi
.2. Это сработало отлично. Я обновился
hw_count = combined_jsons.features.properties.HW_COUNT;
hw_count = feature.properties.HW_COUNT;
, и теперь все, кажется, работает. Спасибо!
Ответ №1:
Вам нужно получить свойство текущего объекта, а не из всех объектов, также проверьте, существует ли свойство:
style: function(feature){
var fillColor,
hw_count = 0;
if(feature amp;amp; feature.properties amp;amp; feature.properties.HW_COUNT){
hw_count = feature.properties.HW_COUNT;
}
if (hw_count > 5) fillColor = "#006837";
else if (hw_count > 0) fillColor = "#78c679";
else fillColor = "#f7f7f7";
return { color: "#999", weight: 1, fillColor: fillColor, fillOpacity: .6 };
}
Комментарии:
1. Похоже, мне даже не нужно было быть таким сложным.
hw_count = feature.properties.HW_COUNT;
похоже, что один сделал свое дело. Я убедился, что свойство существует, когда я объединил исходный geojson и данные на основе API, поэтому я думаю, что я в безопасности, пропуская фазу «проверить, существует ли свойство». Спасибо!
Ответ №2:
Основываясь на предложениях @IvanSanchez и @Falke-Design, я обновил код следующим образом:
L.geoJSON(combined_jsons, {
style: function(feature){
var fillColor,
hw_count = feature.properties.HW_COUNT;
if (hw_count > 5) fillColor = "#006837";
else if (hw_count > 0) fillColor = "#78c679";
else fillColor = "#f7f7f7";
return { color: "#999", weight: 1, fillColor: fillColor, fillOpacity: .6 };
}
} ).addTo(mymap);
Изменение четвертой строки с hw_count = combined_jsons.features.properties.HW_COUNT;
to hw_count = feature.properties.HW_COUNT;
сделало свое дело.
Если бы я не позаботился о добавлении HW_COUNT
записи для каждой страны (даже если значение равно 0), я бы использовал код @Falke-Design, чтобы сначала проверить, существует ли запись.