2012-10-28 6 views
32

Piszę aplikację internetową, która obejmuje nawigację technical illustrations (przesuwanie, powiększanie, klikanie). Zakładam, że to dobre narzędzie do tego, tylko dlatego, że someone used it to make XKCD 1110 pan/zoomable i bardzo podoba mi się, jak się okazało.Czy ulotka jest dobrym narzędziem dla obrazów innych niż mapy?

Oczywiście musiałbym ułożyć i skalować moją oryginalną ilustrację techniczną, ale załóżmy, że jest to problem, który rozwiązałem. Patrząc jednak na wersję Leaflet API, wydaje mi się, że musiałbym zamienić moje ilustracje techniczne (pliki .ai, .svg i .png) na standard geograficzny, taki jak GeoJSON. To wydaje się niezręczną propozycją.

Czy ktoś może polecać ulotkę lub inne narzędzie do nawigacji po obrazach innych niż mapy?

Odpowiedz

22

Możesz to zrobić z ulotką. (Sam to zrobiłem).

Konieczne jest przekonwertowanie rozmiarów pikseli na długość geograficzną (długość/szerokość geograficzna). Ulotka zapewnia łatwy sposób, aby to zrobić przy użyciu Simple "Systemu odniesienia współrzędnych", map.project i map.unproject.

pierwsze, zbudować swoją mapę tak:

var map = L.map('map', { 
    maxZoom: 20, 
    minZoom: 20, 
    crs: L.CRS.Simple 
}).setView([0, 0], 20); 

... a następnie ustawić granice map (dla obrazu, który jest 1024x6145):

var southWest = map.unproject([0, 6145], map.getMaxZoom()); 
var northEast = map.unproject([1024, 0], map.getMaxZoom()); 
map.setMaxBounds(new L.LatLngBounds(southWest, northEast)); 

Jest more details regarding splitting your images available here tym ruby ​​gem, które może również być przydatne.

+0

Jeśli nie trzeba faktycznie _use_ pikseli i są w porządku „fałszywy” geo współrzędne, a następnie nic nie przebije tego rozwiązania: https://build-failed.blogspot.pt/2012/11/zoomable-image-with-leaflet.html Zauważ, że próbowałem rozwiązania opisanego powyżej i otrzymałem różnego rodzaju szalone problemy z układaniem płytek (nie tylko wymieniane kafelki, ale także żądania ujemnych współrzędnych płytek, co nie ma żadnego sensu). Zrezygnowałem z projektu/projektu, ponieważ, dla moich własnych celów, nie potrzebuję dużej precyzji - jestem zadowolony z tego, że znaczniki pozycjonujące mają "fałszywe" współrzędne. –

3

Używam Ulotki do map z niestandardowymi kaflami z geoinformacją, ale z tego, co widzę, Ulotka powinna być w stanie wykonać to zadanie. Istnieje kilka punktów, które należy wziąć pod uwagę, aby uporządkować swoje obrazy, aby można było wyświetlać je w sposób umożliwiający panoramowanie i powiększanie:

Przede wszystkim należy zrozumieć koncepcję nawigowania po mapach i odpowiadających im nazw plików płytek. Ta koncepcja to QuadTree. Przykład tego, jak to działa, można znaleźć pod adresem here.

Następnie należy wyciąć surowe ilustracje techniczne w różnych kaflach. Jeśli zaczniesz tylko na jednym poziomie powiększenia, powinno to być całkiem proste. Następnie możesz użyć płytek w nowym Leaflet TileLayer. Kiedy chcesz powiększyć, może to być trochę trudniejsze. Będziesz musiał znaleźć właściwe granice dla swoich płytek i skonstruować poprawne nazwy plików (patrz powyższe odniesienia do QuadTree).

Podsumowując: Ulotka nie powinna stanowić problemu w Twoim zadaniu. Głównym zadaniem dla ciebie jest stworzenie odpowiednich i poprawnych kafli z twoich nieprzetworzonych danych.

19

Działa to dla obrazów, które nie są wyłożone płytkami.

function init() { 
    var map = L.map('map', { 
     maxZoom: 24, 
     minZoom: 1, 
     crs: L.CRS.Simple 
    }).setView([0, 0], 1); 

    map.setMaxBounds(new L.LatLngBounds([0,500], [500,0])); 

    var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg' 
    var imageBounds = [[250,0], [0,250]]; 

    L.imageOverlay(imageUrl, imageBounds).addTo(map); 
} 
+0

Dlaczego jesteś w stanie uciec bez użycia metody Unproject dla twojego przykładu? Widzę, że to działa, ale kiedy nie używasz płytek, nie powinieneś używać unproject dla współrzędnych? – letsgetsilly

+7

To rozwiązanie byłoby bardziej niezawodne, gdyby korzystało z Unproject, szczególnie jeśli chcesz wiedzieć, na jakim poziomie powiększenia obraz będzie miał rzeczywisty rozmiar. Napisałem [post na blogu o zrobieniu tego] (http://kempe.net/blog/2014/06/14/leaflet-pan-zoom-image.html). –

+0

jakie jest znaczenie obrazu związanego tutaj [[250,0], [0,250]]; jeśli o tym nie wspomnę, co się stanie? – Mou

3

miałem szczęście z MapTiller - http://www.maptiler.com/

+0

MapTiler w rzeczywistości generuje kafelki i przeglądarkę próbek z ulotkami i OpenLayers. –

+0

Tak, jednak jest to płatna usługa; technicznie możesz zrobić wszystko za pomocą funkcji 'convert' ImageMagick'a, coś takiego:' convert -crop 256x256 + repage big_image.png tiles_% d.png' (dzięki Oliverowi Marriottowi za podpowiedź) –

1

Jeśli chcesz opcję non-dachówka, można zrobić całą rzecz stronie klienta bez płytki wstępnie cięcia

Zobacz https://github.com/Murtnowski/GMap-JSlicer

slicer = new JSlicer(document.getElementById('map'), 'myImage.png'); 
slicer.init(); 

Bardzo proste.

+0

Jeśli obraz jest naprawdę wielki, to to może nie być dobry pomysł: D Ale w przypadku obrazów o normalnych rozmiarach sądzę, że twoje podejście działa dobrze. –

0

Największym problemem związanym z użyciem Ulotki jest ustalenie, w jaki sposób płytki muszą być generowane, zamawiane, a następnie prawidłowo wykonywać połączenia, aby wszystko wyglądało zgodnie z oczekiwaniami. Po kilku dniach beznadziejnie wypróbowanie rozwiązanie po rozwiązaniu był jedynym, który pracował dla mnie, dzięki tutorial wykonanej przez Pedro Sousa:

https://build-failed.blogspot.pt/2012/11/zoomable-image-with-leaflet.html

W istocie, to używa GDAL2Tiles do prawidłowo podzielonego płytki w przewidywalny sposób. Jest to narzędzie, które jest łatwo dostępne w większości dystrybucji Linuksa (i podobno działa dobrze również w systemie Mac OS X, używając portów lub podobnych rzeczy). W tym narzędziu nie ma znaków wodnych, ograniczeń co do wielkości itp. Umieść kafelki na katalogach twojego serwera, tak jak wyjaśnia Pedro Sousa w swoim artykule.

Ulotka następnie załaduje "mapę" używając płytek z "fałszywymi" współrzędnymi geograficznymi, używając rozmiaru pliku rastrowego do prawidłowego obliczenia "fałszywej" długości/szerokości geograficznej. Po tym możesz zrobić z nim cokolwiek chcesz, tak jak każdy inny serwer kaflowy. W moim przypadku wystarczy tylko usunąć kilka znaczników, więc nie przejmowałem się systemem współrzędnych, nad którym pracowałem - poniższa funkcja była przydatna do wyodrębnienia "fałszywych" współrzędnych geograficznych, aby wiedzieć, gdzie umieścić znaczniki :

var popup = L.popup(); 
function onMapClick(e) { 
    popup 
     .setLatLng(e.latlng) 
     .setContent("You clicked the map at " + e.latlng.toString() + "\nZoom level is " + map.getZoom()) 
     .openOn(map); 
} 
map.on('click', onMapClick); 

i udało się z powodzeniem zastąpić starą Flash oparte na mapę za pomocą nawigatora dla pacjenta i zasadniczo replikować prawie każdy funkcjonalność Flash (nawet przy użyciu tych samych markerów i wszystko!). Z oczywiście przewagą, jaką Ulotka będzie działać na urządzeniach z systemem iOS - a dzięki układaniu płytek rozwiązanie wykorzystujące Ulotkę działa znacznie, znacznie szybciej niż stare podejście oparte na technologii Flash ...

Alternatywą może być OpenLayers, która może również obsługiwać obrazy rastrowe, bez kafelków - wystarczająco dobre, jeśli masz stosunkowo mały obraz.

BTW, tutaj jest porównanie różnych ram - nie wszyscy sobie z obrazami statycznymi, choć: https://www.toptal.com/web/the-roadmap-to-roadmaps-a-survey-of-the-best-online-mapping-tools