Program mapa, jak zrobić?

Program mapa, jak zrobić?
HU
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 7 lat
0

Witam,
Mam potrzebę napisania programu, który będzie działał na zasadzie google maps ale w wersji off-line. szperając po necie dowiedziałem się, że mapy googlowskie zawsze będą chciały mieć połączenie z internetem, ktoś zaproponował OpenLayers, ale zielonego pojęcia nie mam o co chodzi.

Może istnieje jakiś komponent, coś w stylu TImage, do którego wstawiłbym wielką bitmapę i mógłbym kontrolować jego zoom i przesuwać tą bitmapę po formie (lub po komponencie).

edytowany 1x, ostatnio: olesio
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
0

Wsadzasz TImage w TScrollBox i po sprawie.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
abrakadaber
abrakadaber
ta i powodzenia w ładowaniu JPGa 100000 na 1000000 pikseli...
_13th_Dragon
Jak mu OpenLayers nie pasuje bo zbyt skomplikowane ...
HU
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 7 lat
0

no ok, a czy da się wtedy jakoś kontrolować zoom? tak tylko przesuwać, to dla mnie połowa sukcesu, teraz jeszcze zoom by się przydał :P

A czekaj mam, można to kontrolować za pomocą wielkości samego okna TImage, przy Stretch=true obrazek się "rozszerza" wraz z za szerokim komponentem TImage.

Wystarczy, że obrazek 500x500px damy w TImage 1000x1000 i już on się dwukrotnie poszerzy. zmienimy rozmiary z 1000 na 2000 to znowu jakbyśmy dostali zoom 4x

edytowany 2x, ostatnio: Huherko
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
0

Jak dasz w TImage AutoStretch na true to możesz sam kontrolować wymiary:
TImage.Width:=ZoomTImage.Picture.Width;
TImage.Height:=Zoom
TImage.Picture.Height;


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
0

@_13th_Dragon bez przesadyzmu - takie coś (mapy) się realizuje pisząc własne jej rysowanie na podstawie danych. Dane te to np. dane OpenStreetMap, który pokrywa większość planety. Nieskompresowane dane ważą 150GB :D, można oczywiście wybrać tylko interesującą Cię cześć. Co do rysowania to musisz się zapoznać z jednym z formatów opisu map np. ich wewnętrzny OSM XML


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
_13th_Dragon
Czy nigdy na tym forum nie widziałeś: - "... program baza danych ..." gdzie chodzi o zwykły pliczek tekstowy lub binarny. Więc jak czytasz "mapa" na tym forum to spokojnie możesz założyć że prawdopodobnie chodzi o jakiś obrazek max 1000x1000
abrakadaber
abrakadaber
"na zasadzie google maps ale w wersji off-line" nie brzmi jak obrazek 1000x1000
_13th_Dragon
No właśnie off-line czyli nie zbyt dużo danych. Poza tym człowiek nie wie jak zoom'ować TImage. Jeżeli pisze że chcę powtórzyć "google maps w wersji off-line" to albo się porywa s motyką na słońce, albo nie ma na myśli tego co napisał.
pelsta
  • Rejestracja:prawie 19 lat
  • Ostatnio:16 dni
  • Postów:819
0

@Huherko
Na podstawie http://www.codeproject.com/Articles/14793/How-Google-Map-Works kiedyś napisałem swój program tego typu.

Bagietka
  • Rejestracja:ponad 20 lat
  • Ostatnio:ponad 5 lat
1

Wielka bitmapa to bardzo zły pomysł. O ile przy obrazku np 2000x1000px bedzie to działać OK, tak przy większych obszarach zaczną się problemy z pamięcia i płynnością obsługi. Konieczne bedzie kafelkowanie. Ja robię to tak (C# Windows Mobile):
-mapa pocięta na plasterki 500x500px nazwane zgodnie z szablonem: <nazwa_mapy>_kolumna_wiersz.png
-okno aplikacji ma 800x480px tak więc w skrajnym przypadku potrzeba wyświetlić 6 obrazków (3 kolumny, 2 wiersze)
-na formie mam Picturebox o wymiarach 1500x1000px, na którym rysuję 6 obrazków z powyższego zestawu
-które to mają być obrazki wyliczam z aktualnego położenia Pictureboxa (mozna go przesuwać i skalować ze strechem)
-kiedy podczas przesuwania brzeg Pictureboxa zbliży się do krawędzi okna następuje jego przeskok o 500px w stronę przeciwną do osiąganej krawędzi, a mapa jest przerysowywana zgodnie a bieżącym położeniem, np. jesli mamy załadowane obrazki 1x1 2x1 3x1 1x2 2x2 3x2 i przesuneliśmy mapę w lewo tak że prawy brzeg mapy ma zamiar pojawić sie w oknie (np jest juz 70px od jego krawędzi) wtedy Pictureboxa przesuwam o 500px w prawo i rysuje na nim obrazki 2x1 3x1 4x1 2x2 3x2 4x2
Do tego dochodzi sprawdzanie czy osiągneliśmy koniec mapy, tzn czy są jeszcze jakieś obrazki do załadowania i parę innym kwestii, ale o tym innym razem.
Mam nadzieję, że dobrze to wyjaśniłem


Nie trąb proszę. Ty też się kiedyś uczyłeś.
edytowany 1x, ostatnio: Bagietka
_13th_Dragon
Zmień 500x500 na 128x128 a zobaczysz jak ci podskoczy wydajność. ;)
Bagietka
Rozważałem zmniejszenie kafelków, ale uznałem że spowodowałoby to niepotrzebne skomplikowanie i drastyczny wzrost operacji plikowych. A 8-bitowy obrazek 500x500px to tylko 245kB.
_13th_Dragon
A rozważałeś eksperymentem myślowym czy praktycznie? To nie tylko zmniejszenie, to zmiana na rozmiar który jest potęgą dwójki.
Bagietka
Rozważania to chyba z definicji są tylko teoretyczne. Czy słuszne, nie mam pojęcia. No wiem że to 128=2^7, czy to ma jakieś znaczenie w tym kontekscie?
_13th_Dragon
Więc zrób taki teścik porównawczy a zobaczysz różnice.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.