JSFiddle - React, Tailwind, and code Playground
HTML
<div id="map"></div>
CSS
</style>
<script type="text/javascript" src="https://api-maps.yandex.ru/2.1/?lang=ru_RU"></script>
<script src="//yandex.st/jquery/2.2.3/jquery.min.js" type="text/javascript"></script>
<style>
html, body, #map {
width: 100%; height: 100%; padding: 0; margin: 0;
JavaScript
ymaps.ready(init);
var placemark, myMap;
// Размер привязан к географическим координатам
var sizePlaceMarkLatLng = 0.2;
function init () {
myMap = new ymaps.Map('map', {
center: [55, 37],
zoom: 10
}, {
searchControlProvider: 'yandex#search'
});
// PLACEMARK из SVG
var svg = '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 40 40" preserveAspectRatio="none" width="$[options.width]" height="$[options.height]"><circle cx="20px" cy="20px" r="20px" fill="rgb(255, 0, 0)"/></svg>';
var size = calcSize();
placemark = new ymaps.Placemark([55, 37], {}, {
"iconLayout": ymaps.templateLayoutFactory.createClass(svg, {}),
"visible": true,
'iconWidth': size,
'iconHeight': size,
'iconOffset': [-size/2, -size/2]
});
myMap.geoObjects.add(placemark);
//При зумировании карты меняем размеры Placemark
var intervalId = null;
myMap.events.add('actiontick', function (e) {
setNewSize();
});
myMap.events.add('actionbegin', function (e) {
intervalId = setInterval(setNewSize, 30);
});
myMap.events.add('actionend', function (e) {
clearInterval(intervalId);
intervalId = null;
});
};
//Установить новый размер
function setNewSize() {
var size = calcSize();
placemark.options.set({
'iconWidth': size,
'iconHeight': size,
'iconOffset': [-size/2, -size/2]
});
}
// Размер приявязан к географическим координатам.
// Вычисляем размер в экранных пикселях в зависимости от масштаба карты
function calcSize() {
var zoom = myMap.action.getCurrentState().zoom;
var startScreenCoord = latLngToScreen(0, 0, zoom);
var endScreenCoord = latLngToScreen(sizePlaceMarkLatLng, sizePlaceMarkLatLng, zoom);
return Math.abs(endScreenCoord[0] - startScreenCoord[0]);
}
// Преобразует географические координаты в экранные
function latLngToScreen(lat, lng, zoom){
...