Подтвердить что ты не робот

Изменение цвета маркера

Есть ли способ случайного изменения маркерных цветов в родном листе? Я использую элементы svg, которые можно было бы создать. Я знаю, что это возможно с помощью mapbox.js

EDIT: Чтобы уточнить, что я намереваюсь сделать: если вы добавите маркеры на карту с помощью двойного щелчка или что-то, это должно иметь случайные цвета. Для этого я хотел использовать значки svg для маркеров, чтобы их стиль.

Это мой код:

myIcon = L.icon({
  iconUrl: "icon_33997.svg",
  iconAnchor: pinAnchor
});

newMarker = L.marker(lat, long], {
  icon: myIcon
});
4b9b3361

Ответ 1

Так что это один из лучших хитов в Google для стилизации Leaflet Icon, но у него не было решения, которое работало бы без сторонних разработчиков, и у меня возникла эта проблема в React, поскольку нам требовались динамические цвета для наших маршрутов и значков.

Решение, которое я придумал, состояло в том, чтобы использовать атрибут Leaflet.DivIcon html, который позволяет передавать строку, которая оценивается в элемент DOM.

Так, например, я создал следующий стиль маркера:

const myCustomColour = '#583470'

const markerHtmlStyles = '
  background-color: ${myCustomColour};
  width: 3rem;
  height: 3rem;
  display: block;
  left: -1.5rem;
  top: -1.5rem;
  position: relative;
  border-radius: 3rem 3rem 0;
  transform: rotate(45deg);
  border: 1px solid #FFFFFF'

const icon = Leaflet.divIcon({
  className: "my-custom-pin",
  iconAnchor: [0, 24],
  labelAnchor: [-6, 0],
  popupAnchor: [0, -36],
  html: '<span style="${markerHtmlStyles}" />'
})

Измените background-color в markerHtmlStyles на свой собственный цвет, и все готово.

Map with multiple coloured Markers

Ответ 2

Привязать значки с этого сайта!

https://github.com/pointhi/leaflet-color-markers

Подробная информация о том, как включить информацию на веб-сайте.

Ответ 3

Маркеры листовок хранятся в виде файлов, в отличие от других объектов (например, полилиний и т.д.).

Если вам нужны собственные маркеры, вы можете найти Официальный буклет-учебник, в котором объясняется, как это сделать.

ОБНОВЛЕНИЕ:

Прочитав этот разговор с основным разработчиком, я искал маркер SVG и здесь он.

Благодаря этому вы сможете раскрасить маркер так, как хотите, и произвольно установить его цвет.

ИЗМЕНИТЬ СНОВА:

Вы можете использовать MakiMarkers, чтобы установить цвет маркера, и использовать это расширение для создания случайных вещей. (Это просто и хорошо объяснено)

Ответ 4

Поскольку вы работаете с элементами svg, вы можете подать значок маркера вашего листка с помощью L.divIcon html вместо использования iconUrl из L.icon, чтобы связать ваше изображение.

L.marker(latlng, {
    icon: L.divIcon({
        className: 'ship-div-icon',
        html: '<svg>...</svg>'
    })
}).addTo(map);

Затем используйте свойство fill, чтобы покрасить вашу форму svg. Может быть полезно добавить класс \es в svg path\s для точного управления

<svg ... >
    <g>
        <path class="ship-icon" ... />
    </g>
    ...
</svg>

В конце, так как мне также потребовалось случайное изменение цвета маркера, я сразу изменил свойство заполнения пути во время создания маркера

var pathFillColor = '#'+(Math.random()*0xFFFFFF<<0).toString(16);

L.marker(latlng, {
    icon: L.divIcon({
        className: 'ship-div-icon',
        html: '<svg ... ><g><path fill="'+pathFillColor+'" ... /> </g></svg>'
    })
}).addTo(map);

Ответ 5

Попробуйте Leaflet.awesome-markers lib - он позволяет вам устанавливать цвета и другие стили.

Ответ 6

Ahh прослушиватель событий и измените значок с помощью метода setIcon():

createdMarker.on("dblclick", function(evt) {

        var myIcon = L.icon({
            iconUrl: 'res/marker-icon-red.png',
            shadowUrl: 'res/marker-shadow.png'
        });
        this.setIcon(myIcon);
});

Ответ 7

Вы также можете использовать API графиков Google для получения значков (просто измените "abcdef" на нужный вам шестнадцатеричный цвет:

Примеры:

Ответ 8

Вот SVG иконы.

<svg width="28" height="41" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
 <defs>
  <linearGradient id="b">
   <stop stop-color="#2e6c97" offset="0"/>
   <stop stop-color="#3883b7" offset="1"/>
  </linearGradient>
  <linearGradient id="a">
   <stop stop-color="#126fc6" offset="0"/>
   <stop stop-color="#4c9cd1" offset="1"/>
  </linearGradient>
  <linearGradient y2="-0.004651" x2="0.498125" y1="0.971494" x1="0.498125" id="c" xlink:href="#a"/>
  <linearGradient y2="-0.004651" x2="0.415917" y1="0.490437" x1="0.415917" id="d" xlink:href="#b"/>
 </defs>
 <g>
  <title>Layer 1</title>
  <rect id="svg_1" fill="#fff" width="12.625" height="14.5" x="411.279" y="508.575"/>
  <path stroke="url(#d)" id="svg_2" stroke-linecap="round" stroke-width="1.1" fill="url(#c)" d="m14.095833,1.55c-6.846875,0 -12.545833,5.691 -12.545833,11.866c0,2.778 1.629167,6.308 2.80625,8.746l9.69375,17.872l9.647916,-17.872c1.177083,-2.438 2.852083,-5.791 2.852083,-8.746c0,-6.175 -5.607291,-11.866 -12.454166,-11.866zm0,7.155c2.691667,0.017 4.873958,2.122 4.873958,4.71s-2.182292,4.663 -4.873958,4.679c-2.691667,-0.017 -4.873958,-2.09 -4.873958,-4.679c0,-2.588 2.182292,-4.693 4.873958,-4.71z"/>
  <path id="svg_3" fill="none" stroke-opacity="0.122" stroke-linecap="round" stroke-width="1.1" stroke="#fff" d="m347.488007,453.719c-5.944,0 -10.938,5.219 -10.938,10.75c0,2.359 1.443,5.832 2.563,8.25l0.031,0.031l8.313,15.969l8.25,-15.969l0.031,-0.031c1.135,-2.448 2.625,-5.706 2.625,-8.25c0,-5.538 -4.931,-10.75 -10.875,-10.75zm0,4.969c3.168,0.021 5.781,2.601 5.781,5.781c0,3.18 -2.613,5.761 -5.781,5.781c-3.168,-0.02 -5.75,-2.61 -5.75,-5.781c0,-3.172 2.582,-5.761 5.75,-5.781z"/>
 </g>
</svg>

Ответ 9

Я нашел маркер/значок SVG, чтобы быть лучшим. Он очень гибкий и позволяет любой цвет вам нравится. Вы можете настроить весь значок без особых проблем:

function createIcon(markerColor) {
  /* ...Code ommitted ... */

  return new L.DivIcon.SVGIcon({
            color: markerColor,
            iconSize: [15,30],
            circleRatio: 0.35
  });
}

Ответ 10

В R используйте функцию addAwesomeMarkers(). Пример кода, показывающий красный маркер:

leaflet() %>%
addTiles() %>%
addAwesomeMarkers(lng = -77.03654, lat = 38.8973, icon = awesomeIcons(icon = 'ion-ionic', library = 'ion', markerColor = 'red'))

Ссылка на иконки ионов: http://ionicons.com/

Ответ 11

Напишите функцию, которая с учетом цвета (или любых других характеристик) возвращает SVG-представление нужного значка. Затем, при создании маркера, свяжите эту функцию с соответствующим параметром (ами).

Ответ 12

добавив @tutts превосходный ответ, я изменил его так:

... включает подпись - где вы можете использовать значки FontAwesome или аналогичные...

var myCustomColour = '#334455d0', // d0 -> alpha value
    lat = 5.5,
    lon = 5.5;

var caption = '', // '<i class="fa fa-eye" />' or 'abc' or ...
    size = 10,    // size of the marker
    border = 2;   // border thickness

var markerHtmlStyles = ' \
    background-color: ' + myCustomColour + '; \
    width: '+ (size * 3) +'px; \
    height: '+ (size * 3) +'px; \
    display: block; \
    left: '+ (size * -1.5) +'px; \
    top: '+ (size * -1.5) +'px; \
    position: relative; \
    border-radius: '+ (size * 3) +'px '+ (size * 3) +'px 0; \
    transform: rotate(45deg); \
    border: '+border+'px solid #FFFFFF;\
    ';

var captionStyles = '\
    transform: rotate(-45deg); \
    display:block; \
    width: '+ (size * 3) +'px; \
    text-align: center; \
    line-height: '+ (size * 3) +'px; \
    ';

var icon = L.divIcon({
    className: "color-pin-" + myCustomColour.replace('#', ''),

    // on another project this is needed: [0, size*2 + border/2]
    iconAnchor: [border, size*2 + border*2], 

    labelAnchor: [-(size/2), 0],
    popupAnchor: [0, -(size*3 + border)],
    html: '<span style="' + markerHtmlStyles + '"><span style="'+captionStyles+'">'+ caption + '</span></span>'
});

var marker = L.marker([lat, lon], {icon: icon})
.addTo(mymap);

и версия ES6 (например, @tutts).. Я использую ее с vue-leaflet

// caption could be: '<i class="fa fa-eye" />',
function makeMarkerIcon(color, caption) {
	let myCustomColour = color + 'd0';

	let size = 10,    // size of the marker
		border = 2;   // border thickness

	let markerHtmlStyles = '
		background-color: ${myCustomColour};
		width: ${size * 3}px;
		height: ${size * 3}px;
		display: block;
		left: ${size * -1.5}px;
		top: ${size * -1.5}px;
		position: relative;
		border-radius: ${size * 3}px ${size * 3}px 0;
		transform: rotate(45deg);
		border: ${border}px solid #FFFFFF;
		';

	let captionStyles = '
		transform: rotate(-45deg);
		display:block;
		width: ${size * 3}px;
		text-align: center;
		line-height: ${size * 3}px;
		';

	let icon = L.divIcon({
		className: 'color-pin-' + myCustomColour.replace('#', ''),
		iconAnchor: [border, size*2 + border*2],
		labelAnchor: [-(size/2), 0],
		popupAnchor: [0, -(size*3 + border)],

		html: '<span style="${markerHtmlStyles}"><span style="${captionStyles}">${caption || ''}</span></span>'
	});

	return icon;
}

var marker = L.marker([lat, lon], {icon: makeMarkerIcon('#123456d0', '?')})
.addTo(mymap);

Ответ 13

1) Добавить маркер 2) найдите атрибут backgroundcolor для css и измените его. Вот:
JS

var myIcon = L.divIcon({
      className: 'my-div-icon',
      iconSize: [5, 5]
    });
var marker = L.marker([50,-20], {icon: myIcon}).addTo(map);
    marker.valueOf()._icon.style.backgroundColor = 'green'; //or any color