Я строю карту листовки недавних землетрясений, которая использует три API для создания трех групп слоев на карте. Я также создаю боковую панель со списком землетрясений только по одной из трех ссылок API. Когда пользователь нажимает на маркер карты, появляется всплывающее окно с дополнительной информацией о землетрясении. И когда они нажимают на элемент списка на боковой панели, я бы хотел, чтобы открылось всплывающее окно для соответствующего землетрясения, так же, как если бы пользователь нажал на маркер.
Всплывающие окна работают нормально, когда пользователь нажимает на маркеры карты. Однако, когда я нажимаю на элемент списка, всплывающие окна с правильной информацией открываются, но все они появляются в одном и том же месте, а не в правильном широте землетрясения.
Я попытался использовать FeatureGroup вместо LayerGroup, как предложено здесь , но происходит то же самое. Я также попытался добавить всплывающее окно к указанному слою c с помощью addTo (Layers [Key]) ;, но это также ничего не меняет.
Вот соответствующий код:
URLs = {
PAST_MONTH: "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.geojson",
PAST_WEEK: "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_week.geojson",
PAST_DAY: "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_day.geojson",
};
Object.entries(URLs).forEach(([key, url]) => {
d3.json(url).then(function (response){
//Add features to the map.
response.features.forEach(feature => {
var calif = feature.properties.title.split(",");
if (calif[1] === " CA") {
console.log(feature.properties.title);
quake = L.geoJSON(feature, {
pointToLayer: function(feature, latlng) {
return L.circleMarker(latlng, {
radius: getRadius(feature.properties.mag),
fillColor: getColor(feature.properties.mag),
color: getColor(feature.properties.mag),
weight: 1,
opacity: 1,
fillOpacity: 0.8
});
},
});
//populate the sidebar with JUST the list of earthquakes in the past week
if (url === URLs.PAST_WEEK) {
var list = document.getElementsByClassName("quake-list");
var listItem = document.createElement("li");
listItem.innerHTML = feature.properties.title + " " + moment(feature.properties.time).startOf('day').fromNow();
list[0].appendChild(listItem);
listItem.addEventListener('click', function() {
quake.bindPopup("<h3>" + feature.properties.title + "</h3><hr>" +
"<strong>Magnitude: </strong>" + feature.properties.mag +
"<br><strong>Date and time: </strong>" + convertUnixTime(feature.properties.time))
quake.openPopup();
})
}
// Add popup with info, when user clicks on map markers
quake.bindPopup("<h3>" + feature.properties.title + "</h3><hr>" +
"<strong>Magnitude: </strong>" + feature.properties.mag +
"<br><strong>Date and time: </strong>" + convertUnixTime(feature.properties.time));
// Add to specific layer
quake.addTo(layers[key]);
};
});
});
});
И это специфическая c часть, где я не могу понять, как привязать всплывающие окна к элементам списка, чтобы они появлялись на правильном лат / лнг:
//populate the sidebar with JUST the list of earthquakes in the past week
if (url === URLs.PAST_WEEK) {
var list = document.getElementsByClassName("quake-list");
var listItem = document.createElement("li");
listItem.innerHTML = feature.properties.title + " " + moment(feature.properties.time).startOf('day').fromNow();
list[0].appendChild(listItem);
listItem.addEventListener('click', function() {
quake.bindPopup("<h3>" + feature.properties.title + "</h3><hr>" +
"<strong>Magnitude: </strong>" + feature.properties.mag +
"<br><strong>Date and time: </strong>" + convertUnixTime(feature.properties.time))
quake.openPopup();
})
}
Я новичок в Leaflet и буду признателен за любую помощь. Я уверен, что упускаю что-то очевидное, но я ломал голову, пытаясь понять, чего мне не хватает. Спасибо!