Zaczniemy od zbudowania struktury, która pozwoli w miarę łatwo przechowywać obiekty linii. W tym celu zastosujemy listę dwukierunkową. Kod listy jest dostępny tutaj: http://code.google.com/p/google-maps-michal-examples/source/browse/trunk/DoubleLinkedList.js
Metody listy to:
- push(element) - dodanie elementu na koniec listy
- pop() - pobranie i usunięcie elementu z końca listy
- getAt(i) - pobranie elementu z i-tej pozycji (liczymy od 0)
- insertAt(i, element) - wstawienie elementu na i-tą pozycję
- setAt(i, element) - napisanie danych na i-tej pozycji
- toArray() - zwrócenie listy jako tablicy
var polylines = new DoubleLinkedList();Teraz możemy zabrać się za dodawanie linii do listy. W momencie, kiedy zaczynamy tworzyć linię jest wykonywane zdarzenie lineupdate dlatego, też w tym miejscu będziemy dodawać linię do listy. W momencie dodania jej do listy otrzymany indeks zapisujemy w obiekcie linii tak, aby był on później łatwo dostępny (bez konieczności szukania w liście). Ponieważ zdarzenie lineupdate nie przekazuje w parametrach uchwytu do aktualnej linii, dlatego w momencie podpinania zdarzenia tworzymy funkcję, która przekaże ten parametr.
GEvent.addListener(poly, "lineupdated", function(){updatePoly(poly);});
Funkcja updatePoly korzysta z uniwersalnej funkcji updatePolyData(i), która aktualizuje współrzędne dla linii, która ma i-ty indeks.function updatePoly(poly) {
if (poly.indexInDoubleLinkedList == undefined) {
var i = polylines.push(poly);
poly.indexInDoubleLinkedList = (i-1); // liczymy od zera
}
updatePolyData(poly.indexInDoubleLinkedList);
}
W momencie zdarzenia zakończenia edycji linii nie musimy już wykonywać żadnych operacji.
Następnym elementem będzie nasza uniwersalna metoda updatePolyData. Będzie ona obsługiwać zarówno dostępny z poprzednich wpisów element textarea, ale także tabelkę ze spisem dostępnych ścieżek.
Obsługa textarea będzie opierała się na funkcji getCoordsLastPoly, ale zmienna poly, będzie przypisana jako:
var poly = polylines.getAt(i);Tabelka jest zbudowana na elemencie table. W niej będziemy przechowywać informacje o numerze linii oraz jej długości. Będzie tam także umieszczony link do usuwania linii. Obsługa tabelki będzie więc sprowadzać się do odświeżania zawartości pola tbody wypełniając go zdefiniowanym HTML'em:
function updatePolyData(i) {
// czyszczenie danych
document.getElementById('tabelka').getElementsByTagName('tbody')[0].innerHTML = '';
document.getElementById('textarea').innerHTML = '';
if (polylines.length == 0) {
return;
}
var poly = polylines.getAt(i);
/** obsługa tabelki **/
var html = '';
var polyIterator = polylines.startElement;
for (var j=0; j<polylines.length; j++)
html += 'Linia nr '+j+'';
html += ''+Math.round(polylines.getAt(j).getLength()*100)/100+' m';
html += 'usuń';
polyIterator = polyIterator.nextElement;
}
document.getElementById('tabelka')
.getElementsByTagName('tbody')[0].innerHTML = html;
/** obsługa współrzędnych **/
if (document.getElementById('plainText').checked) {
for (var i=0; i<poly.getvertexcount(); i++)
var vertex = poly.getVertex(i);
document.getElementById('textarea').innerHTML += vertex.lat()+', '+vertex.lng()+"\n";
}
}else
poly.getKml(function(kml) {document.getElementById('textarea').innerHTML = kml});
}
}
Pewna zmiana także jest wprowadzona w metodzie draw - mianowicie element poly jest lokalny:
function draw() {
var poly = new GPolyline([], 'black');
map.addOverlay(poly);
poly.enableDrawing({});
poly.enableEditing({onEvent: "mouseover"});
poly.disableEditing({onEvent: "mouseout"});
GEvent.addListener(poly, "lineupdated", function(){updatePoly(poly);});
GEvent.addListener(poly, "click", function(latlng, index) {
updatePolyData(poly.indexInDoubleLinkedList);
});
}Usuwanie linii jest realizowane przez funkcję removeLine, gdzie parametrem jest indeks. Wykorzystując API Google Maps z obiektu GMap wykonujemy funkcję removeOverlay(GPolyline), która załatwia wszystko. Musimy jeszcze pamiętać o usunięciu elementu z listy oraz nadaniu pozostałym elementom nowych indeksów z listy.
function removeLine(i) {
map.removeOverlay(polylines.getAt(i));
polylines.removeAt(i);
updatePolyData(0);
var polyIterator = polylines.startElement;
if (polylines.length>0)
for (var j=0; j<polylines.length; j++)
polyIterator.data.indexInDoubleLinkedList = j;
polyIterator = polyIterator.nextElement;
}
}
Ostateczny efekt jest następujący:
Nowa linia
| numer linii | długość | usuń |
|---|

Brak komentarzy:
Prześlij komentarz