2011-01-11 17 views
7

Web uygulamamda işaretçiler oluşturabilir ve bu işaretçilerle google yol tarifi içeren bir rota oluşturabilirsiniz. Ancak, kullanıcının rotayı değiştirebilmesini ve google maps api v3'te sürüklenebilir yol tarifleri bulmasını istiyorum. Değiştirilen yönleri veritabanında saklamak için bir yol var mı, böylece bu yolla kesin rotayı yeniden oluşturabilirsiniz? Aşağıdaki varsaymak gidiyorumGoogle maps sürüklenen yol tariflerini kaydediyor

+0

Hangi 3 sürümünü kullanıyorsunuz? 0,1, 0,2 veya 0,3? – sdleihssirhc

+0

@sdleihssirhc API'nin –

+0

@Sam Sürüm 3'ü: Neredeyse hiçbir teknik özellik içermeyen bu soruya bir ödül vermek iyi bir fikir değildir ... örneğin, JS tarafından oluşturulan ilk işaretçiler mi, yoksa haritaya tıklayarak kullanıcı mı? yol tarifi ne olacak? talimatlar tam olarak ne zaman DB içinde saklanmalıdır? hemen? veya kaydetmeyi onaylamak için her sürüklemeden sonra bir açılır pencere gösterilmeli mi? Şimdiye kadar yaptığınız şeyi yapıştırın [pastebin] (http://pastebin.com/) – ifaour

cevap

23

tüm doğrudur: Temelde

var map = new google.maps.Map(document.getElementById('map_canvas'), { 
     zoom: 8, 
     center: new google.maps.LatLng(/* center of map */), 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }), 
    directions = new google.maps.DirectionsService(), 
    displayer = new google.maps.DirectionsRenderer({ 
     draggable: true 
    }); 

displayer.setMap(map); 
directions.route({ 
    origin: new google.maps.LatLng(/* start point */), 
    destination: new google.maps.LatLng(/* end point */), 
    travelMode: google.maps.DirectionsTravelMode.DRIVING 
}, function (result) { 
    displayer.setDirections(result); 
}); 

, bu sadece başlangıç ​​ve bitiş noktaları zaten seçilmiş ve varsayılan rota zaten çizilmiş olduğunu varsayar. (Not:DirectionsRendererdraggable: true ile başlatıldı.)

kullanım yol değişikliği, uygulama directions_changed olayı tetikler. Biz şöyle olduğunu izleyebilirsiniz: Başka

google.maps.event.addListener(displayer, 'directions_changed', some_method); 

şey değişim rota zaman da olur: Yeni waypoint oluşturulur.

var some_method = function() { 
    var waypoints = displayer.directions.route[0].legs[0].via_waypoint; 
}; 

değişken waypoints rota hedefe yolunda yapar durur açıklayan nesnelerin bir dizidir: Hepimizin ara nokta almak şekli aşağıdaki gibidir. (Daha fazla varsayımlar yapıldığını Not: route[0], legs[0] vb kullandığınız)

Her waypoint nesne (nedense sırasıyla location.wa ve location.ya mevcut) enlem ve boylam içeren bir location özelliğine sahiptir . Bu yüzden, kullanıcı rotayı her değiştirdiğinde uygulamayı, mevcut yol noktalarının tüm latekslerini ve uzunlarını döndürmek (ve saklamak) için söyleyebiliriz. Bunları aldıktan sonra, bunları nasıl depolamak istediğinize karar verebilirsiniz (AJAX, bunları bir veritabanında saklayan bir sunucu tarafı sayfasına, localStorage, vb.)

Sonra!

bu sayfayı yüklemek dahaki sefere depolama gelenler noktalarını kapmak ve şöyle rotayı başlatabilir:

directions.route({ 
    origin: new google.maps.LatLng(/* start point */), 
    destination: new google.maps.LatLng(/* end point */), 
    travelMode: google.maps.DirectionsTravelMode.DRIVING, 
    waypoints: [ 
     { location: new google.maps.LatLng(/* lat/lng go here */) } // repeat this as necessary 
    ] 
}, function (result) { 
    displayer.setDirections(result); 
}); 

Bu kullanıcı seçtiği yeni bir rota muhafaza edilmelidir. Son bir not: 'u bu yanıtın dışına bıraktım, gibi'u nasıl kaydettiklerini, hangi kullanıcının hangi rotayı istediğini nasıl bildiğinizi vb. Ama temel var. Yolunuz açık olsun.

+0

teşekkürler! bunu deneyecek – qkp

+0

@qkp Cevabın kabul edilebilmesi için yeterince teşekkürler ...? – sdleihssirhc

+0

Denedim, ancak yol tarifi servis çağrısı sırasında hatalar aldım! api'de neden maksimum yol noktaları 10 durak olduğunu ve özel bir yolun daha fazla durduğunu söyler, bu yüzden neden onu değiştirmeye karar verdim. Ben tüm polyline şifreli polyline tho olarak kaydederek etrafında bir iş yaparak sabit! – qkp

3

Bu, sdleihssirhc'nin yanıtı arasında değişen bir şey olabilir, ancak yukarıdaki çözümü denedim ve displayer.directions.route [0] undefined olduğunu söyleyerek başarısız oldu.

Bu özellik routes olarak değiştirilmiş gibi görünüyor. Benim için işler aşağıda hattıyla:

var waypoints = displayer.directions.routes[0].legs[0].via_waypoint; 

Umarım bu işe almaya çalışırken herkes için biraz zaman ve hayal kırıklığı kurtaracak.