Bu yazının biraz eski olduğunu biliyorum, ancak bu konuda o kadar kötü bilgi gördüm ki, SO'da çığlık atabilirim. Bu yüzden, birçok haritada güvenilir bir şekilde kullandığım için işe yaradığını bildiğim tamamen farklı bir yaklaşımla iki sentimi atmalıyım. Bunun yanı sıra, OP'nin ok işaretini harita noktasının etrafında da döndürme yeteneğini istediğine inanıyorum ki bu, simgeyi kendi x, y ekseni etrafında döndürmekten farklı olarak ok işaretinin haritada gösterdiği yeri değiştirecektir.
Öncelikle, Google haritaları ve SVG ile oynadığımızı unutmayın; bu nedenle, Google'ın işaretçiler (veya gerçekte semboller) için SVG uygulamasını dağıtma yöntemine uyum sağlamalıyız. Google, SVG işaretleyici resmi için bağlantısını, SVG viewBox'ın sol üst köşesi OLMAYAN 0,0 olarak ayarlar. Bunu aşmak için, Google'a istediğini vermek için SVG resminizi biraz farklı bir şekilde çizmelisiniz ... evet yanıt, SVG düzenleyicinizde (Illustrator, Inkscape, vb.) SVG yolunu gerçekte oluşturma şeklinizdedir. .).
İlk adım, viewBox'tan kurtulmaktır. Bu, XML'inizdeki viewBox'ı 0 olarak ayarlayarak yapılabilir ... bu doğru, viewBox için olağan dört bağımsız değişken yerine sadece bir sıfır. Bu, görünüm kutusunu kapatır (ve evet, bu anlamsal olarak doğrudur). Bunu yaptığınızda, muhtemelen görüntünüzün boyutunun hemen atladığını fark edeceksiniz ve bunun nedeni, svg'nin artık görüntüyü ölçeklemek için bir tabanı (viewBox) olmamasıdır. Bu nedenle, genişliğini ve yüksekliğini, resminizin SVG düzenleyicinizin XML düzenleyicisinde olmasını istediğiniz gerçek piksel sayısına ayarlayarak doğrudan bu referansı oluşturuyoruz.
XML düzenleyicide svg görüntüsünün genişliğini ve yüksekliğini ayarlayarak görüntünün ölçeklenmesi için bir temel oluşturursunuz ve bu boyut, varsayılan olarak işaretçi ölçek özellikleri için 1 değeri olur. Markörün dinamik ölçeklendirilmesi için bunun avantajını görebilirsiniz.
Artık resminizi boyutlandırdığınıza göre, görüntüyü, çapa svg düzenleyicinin 0,0 koordinatlarının üzerinde olduğundan, görüntünün olmasını istediğiniz kısmı kadar hareket ettirin. Bunu yaptıktan sonra , svg yolunun d özniteliğinin değerini kopyalayın . Sayıların yaklaşık yarısının negatif olduğunu fark edeceksiniz, bu da bağlantı noktanızı viewBox yerine görüntünün 0,0'ı ile hizalamanın sonucudur.
Bu tekniği kullanmak, haritadaki enlem ve boylam noktaları çevresinde işaretçiyi doğru şekilde döndürmenize olanak sağlar. Bu, svg işaretçisi üzerindeki noktayı işaretçi konumunun enlem ve boylamına bağlamanın tek güvenilir yoludur.
Bunun için bir JSFiddle yapmaya çalıştım , ancak orada uygulamada bazı hatalar var, yeniden yorumlanmış koddan çok hoşlanmamamın nedenlerinden biri. Bunun yerine, deneyebileceğiniz, uyarlayabileceğiniz ve referans olarak kullanabileceğiniz tamamen bağımsız bir örneği aşağıya ekledim. Bu, JSFiddle'da denediğim ve başarısız olan kodun aynısı, ancak Firebug üzerinden sızlanmadan ilerliyor.
<!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>
Bu tam olarak Google'ın Maps API SYMBOL sınıfında bulunan kendi birkaç sembolü için yaptığı şeydir, bu yüzden bu sizi ikna etmezse ... Her neyse, umarım bu sizin için doğru bir SVG işaretçisi oluşturmanıza ve ayarlamanıza yardımcı olur Google haritalarınız sona erer.