Я пытаюсь создать пользовательские маркеры SVG, используя L.Svgoverlay в листочке. Маркеры реализованы как элементы svg . Они работают правильно, когда я увеличиваю и выходу: они остаются на правильных географических позициях. Однако, если я панирует (переместить) карту, а затем увеличить, маркеры соходят без ума. Я не могу выяснить, что я делаю не так.
html, body {
height: 100%;
margin: 0;
font-family: Arial;
}
#map {
height: 100vh;
width: 100vw;
}
.villageMarker {
pointer-events: auto !important;
cursor: pointer;
}
function updateSvgPositionsZoom() {
const mapBounds = map.getBounds();
svgOverlay.setBounds(mapBounds);
const svgOverlayElement = svgOverlay.getElement();
Array.from(svgOverlayElement.children).forEach(icon => {
const i = icon.id.split("_")[1];
const coords = coordinates;
const point = map.latLngToLayerPoint(coords);
icon.setAttribute('transform', `translate(${point.x},${point.y})`);
});
};
async function show() {
for (const i in iconWrappers) {
const coords = coordinates;
const iconWrapper = iconWrappers;
const circle = document.createElementNS(ns, "circle");
circle.setAttribute('r', 10);
circle.setAttribute('fill', '#fc43ab');
circle.setAttribute('stroke', '#000000');
circle.setAttribute('stroke-width', '1');
iconWrapper.appendChild(circle)
const point = map.latLngToLayerPoint(coords);
iconWrapper.setAttribute('transform', `translate(${point.x},${point.y})`);
};
};
async function main() {
map = L.map('map', {center: [52.38, 9.77], zoom: 6});
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
svg = document.createElementNS(ns, "svg");
svg.style.pointerEvents = 'none';
for (const i in coordinates) {
const iconWrapper = document.createElementNS(ns, "g");
iconWrapper.setAttribute('id', `marker_${i}`);
iconWrapper.classList.add('villageMarker');
svg.appendChild(iconWrapper);
iconWrappers.push(iconWrapper);
};
svgOverlay = L.svgOverlay(svg, map.getBounds(), {
interactive: true,
opacity: 1
}).addTo(map);
svgOverlay.getElement().setAttribute('xmlns', ns);
map.on('zoomend', updateSvgPositionsZoom);
show();
};
let pathname;
let map;
let ns = "http://www.w3.org/2000/svg";
let svgOverlay;
let svg;
let coordinates = [
[52.38, 9.77],
[51.52, 7.47],
[53.56, 9.97]
]
let iconWrappers = [];
main();
< /code>
< /div>
< /div>
< /p>
Чего мне не хватает, чтобы маркеры стали стабильными как во время панорамирования, так и во увеличении? Должен ли я справиться с различными событиями или в моей конверсии координат есть фундаментальная ошибка?
Подробнее здесь: https://stackoverflow.com/questions/797 ... le-zooming
Как сделать мои индивидуальные маркеры SVG в листовке, не двигаются во время масштабирования ⇐ Javascript
Форум по Javascript
1755375656
Anonymous
Я пытаюсь создать пользовательские маркеры SVG, используя L.Svgoverlay в листочке. Маркеры реализованы как элементы svg . Они работают правильно, когда я увеличиваю и выходу: они остаются на правильных географических позициях. Однако, если я панирует (переместить) карту, а затем увеличить, маркеры соходят без ума. Я не могу выяснить, что я делаю не так.
html, body {
height: 100%;
margin: 0;
font-family: Arial;
}
#map {
height: 100vh;
width: 100vw;
}
.villageMarker {
pointer-events: auto !important;
cursor: pointer;
}
function updateSvgPositionsZoom() {
const mapBounds = map.getBounds();
svgOverlay.setBounds(mapBounds);
const svgOverlayElement = svgOverlay.getElement();
Array.from(svgOverlayElement.children).forEach(icon => {
const i = icon.id.split("_")[1];
const coords = coordinates[i];
const point = map.latLngToLayerPoint(coords);
icon.setAttribute('transform', `translate(${point.x},${point.y})`);
});
};
async function show() {
for (const i in iconWrappers) {
const coords = coordinates[i];
const iconWrapper = iconWrappers[i];
const circle = document.createElementNS(ns, "circle");
circle.setAttribute('r', 10);
circle.setAttribute('fill', '#fc43ab');
circle.setAttribute('stroke', '#000000');
circle.setAttribute('stroke-width', '1');
iconWrapper.appendChild(circle)
const point = map.latLngToLayerPoint(coords);
iconWrapper.setAttribute('transform', `translate(${point.x},${point.y})`);
};
};
async function main() {
map = L.map('map', {center: [52.38, 9.77], zoom: 6});
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© [url=https://www.openstreetmap.org/copyright]OpenStreetMap[/url] contributors'
}).addTo(map);
svg = document.createElementNS(ns, "svg");
svg.style.pointerEvents = 'none';
for (const i in coordinates) {
const iconWrapper = document.createElementNS(ns, "g");
iconWrapper.setAttribute('id', `marker_${i}`);
iconWrapper.classList.add('villageMarker');
svg.appendChild(iconWrapper);
iconWrappers.push(iconWrapper);
};
svgOverlay = L.svgOverlay(svg, map.getBounds(), {
interactive: true,
opacity: 1
}).addTo(map);
svgOverlay.getElement().setAttribute('xmlns', ns);
map.on('zoomend', updateSvgPositionsZoom);
show();
};
let pathname;
let map;
let ns = "http://www.w3.org/2000/svg";
let svgOverlay;
let svg;
let coordinates = [
[52.38, 9.77],
[51.52, 7.47],
[53.56, 9.97]
]
let iconWrappers = [];
main();
< /code>
< /div>
< /div>
< /p>
Чего мне не хватает, чтобы маркеры стали стабильными как во время панорамирования, так и во увеличении? Должен ли я справиться с различными событиями или в моей конверсии координат есть фундаментальная ошибка?
Подробнее здесь: [url]https://stackoverflow.com/questions/79737452/how-to-make-my-custom-svg-markers-in-leaflet-do-not-move-while-zooming[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия