Я знаю, що цей пост трохи старий, але я бачив стільки поганої інформації про це в SO, що я міг кричати. Тож я просто повинен кинути свої два центи із зовсім іншим підходом, який, на мою думку, працює, оскільки я надійно використовую його на багатьох картах. Крім того, я вважаю, що ОП хотіла можливість повертати маркер стрілки навколо точки на карті, що відрізняється від обертання значка навколо власної осі х, у, яка буде змінюватися там, де маркер стрілки вказує на карті.
По-перше, пам’ятайте, що ми граємо з картами Google і SVG, тому ми повинні враховувати спосіб, яким Google застосовує свою реалізацію SVG для маркерів (або власне символів). Google встановлює якір для зображення маркера SVG на рівні 0,0, що НЕ є лівим верхнім кутом вікна SVG viewBox. Для того, щоб обійти це, ви повинні намалювати своє зображення SVG трохи інакше, щоб надати Google бажане ... так, відповідь полягає в тому, як ви насправді створюєте шлях SVG у своєму редакторі SVG (Illustrator, Inkscape тощо). .).
Першим кроком є позбавлення від viewBox. Це можна зробити, встановивши viewBox у вашому XML на 0 ... правильно, просто один нуль замість звичайних чотирьох аргументів для viewBox. Це вимикає поле перегляду (і так, це семантично правильно). Ви, мабуть, помітите, що розмір вашого зображення негайно стрибає, коли ви це робите, і це тому, що svg більше не має основи (viewBox) для масштабування зображення. Отже, ми створюємо це посилання безпосередньо, встановлюючи ширину та висоту для фактичної кількості пікселів, які ви хочете, щоб ваше зображення знаходилось у редакторі XML вашого редактора SVG.
Встановивши ширину та висоту зображення svg у редакторі XML, ви створюєте базову лінію для масштабування зображення, і цей розмір стає значенням 1 для властивостей масштабу маркера за замовчуванням. Ви можете побачити перевагу цього в динамічному масштабуванні маркера.
Тепер, коли у вас є розмір вашого зображення, переміщуйте зображення до тих пір, поки частина зображення, яку ви хочете отримати, оскільки прив'язка не перевищує 0,0 координат редактора svg. Після цього скопіюйте значення атрибута d шляху svg. Ви помітите, що приблизно половина цифр є від’ємними, що є результатом вирівнювання точки опори для 0,0 зображення замість viewBox.
Потім цей метод дозволить вам правильно обертати маркер навколо точки широти та довжини на карті. Це єдиний надійний спосіб прив’язати потрібну точку на маркері svg до широти та довжини місця розмітки маркера.
Я намагався зробити JSFiddle для цього , але в реалізації є деяка помилка, одна з причин, чому я не так люблю переосмислений код. Тож натомість я подав нижче повністю самостійний приклад, який ви можете спробувати, адаптувати та використовувати як довідковий матеріал. Це той самий код, який я спробував у JSFiddle, але який не вдався, але він пропливає через Firebug без хитання.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="author" content="Drew G. Stimson, Sr. ( Epiphany )" />
<title>Create Draggable and Rotatable SVG Marker</title>
<script src="http://maps.googleapis.com/maps/api/js?sensor=false"> </script>
<style type="text/css">
#document_body {
margin:0;
border: 0;
padding: 10px;
font-family: Arial,sans-serif;
font-size: 14px;
font-weight: bold;
color: #f0f9f9;
text-align: center;
text-shadow: 1px 1px 1px #000;
background:#1f1f1f;
}
#map_canvas, #rotation_control {
margin: 1px;
border:1px solid #000;
background:#444;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
#map_canvas {
width: 100%;
height: 360px;
}
#rotation_control {
width: auto;
padding:5px;
}
#rotation_value {
margin: 1px;
border:1px solid #999;
width: 60px;
padding:2px;
font-weight: bold;
color: #00cc00;
text-align: center;
background:#111;
border-radius: 4px;
}
</style>
<script type="text/javascript">
var map, arrow_marker, arrow_options;
var map_center = {lat:41.0, lng:-103.0};
var arrow_icon = {
path: 'M -1.1500216e-4,0 C 0.281648,0 0.547084,-0.13447 0.718801,-0.36481 l 17.093151,-22.89064 c 0.125766,-0.16746 0.188044,-0.36854 0.188044,-0.56899 0,-0.19797 -0.06107,-0.39532 -0.182601,-0.56215 -0.245484,-0.33555 -0.678404,-0.46068 -1.057513,-0.30629 l -11.318243,4.60303 0,-26.97635 C 5.441639,-47.58228 5.035926,-48 4.534681,-48 l -9.06959,0 c -0.501246,0 -0.906959,0.41772 -0.906959,0.9338 l 0,26.97635 -11.317637,-4.60303 c -0.379109,-0.15439 -0.812031,-0.0286 -1.057515,0.30629 -0.245483,0.33492 -0.244275,0.79809 0.0055,1.13114 L -0.718973,-0.36481 C -0.547255,-0.13509 -0.281818,0 -5.7002158e-5,0 Z',
strokeColor: 'black',
strokeOpacity: 1,
strokeWeight: 1,
fillColor: '#fefe99',
fillOpacity: 1,
rotation: 0,
scale: 1.0
};
function init(){
map = new google.maps.Map(document.getElementById('map_canvas'), {
center: map_center,
zoom: 4,
mapTypeId: google.maps.MapTypeId.HYBRID
});
arrow_options = {
position: map_center,
icon: arrow_icon,
clickable: false,
draggable: true,
crossOnDrag: true,
visible: true,
animation: 0,
title: 'I am a Draggable-Rotatable Marker!'
};
arrow_marker = new google.maps.Marker(arrow_options);
arrow_marker.setMap(map);
}
function setRotation(){
var heading = parseInt(document.getElementById('rotation_value').value);
if (isNaN(heading)) heading = 0;
if (heading < 0) heading = 359;
if (heading > 359) heading = 0;
arrow_icon.rotation = heading;
arrow_marker.setOptions({icon:arrow_icon});
document.getElementById('rotation_value').value = heading;
}
</script>
</head>
<body id="document_body" onload="init();">
<div id="rotation_control">
<small>Enter heading to rotate marker </small>
Heading°<input id="rotation_value" type="number" size="3" value="0" onchange="setRotation();" />
<small> Drag marker to place marker</small>
</div>
<div id="map_canvas"></div>
</body>
</html>
Це саме те, що Google робить для своїх власних кількох символів, доступних у класі SYMBOL API Maps, тому, якщо це вас не переконує ... У будь-якому випадку, я сподіваюся, це допоможе вам правильно зробити і встановити маркер SVG для Ваші мапи Google.