5

Ok. Można by pomyśleć, że byłoby to stosunkowo proste, ale nie.osmdroid, Maps API v2 i fragmenty

Używam otwartych map ulic na mojej stronie internetowej, ponieważ dane są za darmo, można je edytować i aktualizować - mój projekt jest zgodny z tą mantrą, a wraz z ograniczeniami dotyczącymi korzystania z interfejsu Google/ograniczeniami danych zapisanymi w google, mapy google po prostu nie były odpowiednie dla mnie .. przynajmniej w internecie.

Biorąc to pod uwagę, pomyślałem, że pójdę w jego ślady z moją aplikacją na Androida, więc skonfigurowałem osmdroid z wykorzystaniem danych z otwartych ulic.

Mogę mieć ładną mapę w mojej działalności. Poszedłem też za tutorialem i wydawało mi się, że działa przynajmniej tak, że mogę mieć widok mapy w fragmencie wewnątrz tabhost/viewpager. Tym, czego naprawdę chcę (na tabletach), jest lista zakładów w fragmencie po lewej stronie, a fragment mapy po prawej stronie pokazuje, gdzie znajdują się te placówki.

dość prosty i by pomyślał, ale wiele godzin badań sugerują, że to nie jest możliwe, chyba że używasz jakiegoś skomplikowanego kodu i niektóre przestarzałe metody ..

Więc .. The fragment (zawierający mapa) Obciążenia i działa doskonale w tabhost ... mogę uzyskać dostęp do metod w obrębie fragmentu z mojej działalności itp., ale nic nie może po prostu mieć dwa fragmenty obok siebie.

Teraz ... Wiem, że Google właśnie wyszedł z ich API v2 .. Zainstalowałem go i miałem grę .. nie bardzo wiem jak działa osmdroid, myślałem, że mogę aktualizować, więc mam MapFragment zamiast SherlockFragment (I używaj ABS) .. to wtedy zwymiotowałem błędy logcat pytając o klucze API itp. i biorąc pod uwagę, że nie chcę używać danych mapy google, założyłem, że poszedłem źle.

Czy ktoś mógłby doradzić, w jaki sposób mogę uzyskać fragment listy i fragment mapy obok siebie, używając wszystkiego, co jest dostępne na rynku, ale najlepiej wykorzystując dane z otwartego kodu źródłowego, tak, że nie są one ograniczone.

Jestem pewien, że ogólny przegląd "tego, co jest dostępne, i jak działa" byłby bardzo doceniany przez mnóstwo użytkowników .. więc jeśli ktoś mógłby doradzić, byłoby niesamowite!

+0

Nie ma nic złego w coraz klucz API jeśli nie zamierzasz używać swoich danych Sprawdź to przepełnienie http://stackoverflow.com/questions/13695393/open-street-maps-withandand-google-maps-api-v2 – qubz

+0

Wygląda na to, że muszę iść, ale szukam bardziej dogłębnego wyjaśnienia jeśli chodzi o jego działania, np. jak zaimplementować mapę z kaflami open source w jej najprostszej postaci i jak wspomniano w tym pytaniu - nadal stosuje się ograniczenia użytkowania api.Zasadniczo chciałbym więcej w wyjaśnieniu dept używając tego pytania jako Podstawa .. Pozdrawiam –

+0

Z początkiem tego nowego interfejsu API jest bardzo mało prawdopodobne, aby został z nim napisany przewodnik/przykład/samouczek dotyczący integracji z Osm/Osmdroid. Prawdopodobnie ulegnie to zmianie wraz z upływem czasu. – qubz

Odpowiedz

11

Zanim pojawił się nowy interfejs API Map Google, zostałem zmuszony do używania OSMDroid do moich celów. Jednak po kilkukrotnym przeszukaniu źródła, aby dowiedzieć się, dlaczego robi to, co to było (często niepoprawnie), umieram na nową bibliotekę.

Na szczęście nowy interfejs API Map Google pasuje do rachunku. Możesz użyć Google Maps API v2 w swojej aplikacji i nigdy nie będziesz musiał korzystać z map bazowych Google, ale tak, niestety musisz najpierw uzyskać klucz API.

Zakładam, że chcesz użyć OpenStreetMap jako źródła mapy online, więc poniższy kod zostanie dostosowany do tego.

GoogleMap map = <get-map-instance>; 

map.setMapType(GoogleMap.MAP_TYPE_NONE); 

TileOverlayOptions options = new TileOverlayOptions(); 

options.tileProvider(new UrlTileProvider(256, 256) { 
    @Override 
    public URL getTileUrl(int x, int y, int z) { 
     try { 
      String f = "http://tile.openstreetmap.org/%d/%d/%d.png"; 
      return new URL(String.format(f, z, x, y)); 
     } 
     catch (MalformedURLException e) { 
      return null; 
     } 
    } 
}); 

map.addTileOverlay(options); 

można znaleźć bardziej sformalizowanej wersji tego kodu w moim Google Maps API v2 dodatkami biblioteki here.

Ponadto, jeśli kierujesz reklamy na wersje wcześniejsze niż fragmenty Androida, które, jak sądzę, bazujesz na używaniu ABS, zamiast korzystać z MapFragment, upewnij się, że korzystasz z SupportMapFragment.

+0

Tak więc zajęło mi to 4 godziny grania - ale to działa :) Jedyną wadą jest addTileProvider powinien być addTileOverlay .. Czy mógłbyś ewentualnie rozwinąć swoją decyzję/problemy osmdroid? Również - mam nakładki OSM, ale logo Google jest nadal wyświetlane w rogu. Czy zdajesz sobie sprawę, co jest wymagane w zakresie przypisania do OSM/biorąc pod uwagę, że nadal używam "mapy google". Co więcej, zakładam, że jestem nadal ograniczony limitami użycia? zanegowanie jednej z głównych zalet OSM Bez względu na to, bardzo doceniane - dziękuję bardzo !! –

+1

Logo Google jest moim zdaniem błędem, dlatego zgłosiłem tutaj problem: http://code.google.com/p/gmaps-api-issues/issues/detail?id=4648. Pod względem dlaczego nie OSMDroid, to w zasadzie sprowadza się do wydajności, błędów i braku dokumentacji. Jeśli chcesz się dowiedzieć, dlaczego samemu się to udało, przekopiuj źródło i zobacz ile no-opów znajdziesz za pomocą // komentarza TODO w nich. ;) – cocoahero

+1

Zajmowałem się także problemami z OSMdroidem i rozważam to użycie. Jak to działa teraz, gdy masz trochę czasu? – Patrick

3

Numer Sample Code dostarczany z Google Maps Android API v2 zawiera klasę com.example.mapdemo.TileOverlayDemoActivity. Niewielka aktualizacja tej klasy spowoduje wyświetlenie kafelków OpenStreetMap w nowej strukturze v2. Chłodny! Nie musisz już używać osmdroidów ani sherlockowych fragmentów. Jednak...Płyty nie są buforowane :(

W każdym razie, wszystkie dodatki/aktualizacje do klasy TileOverlayDemoActivity są przedstawione poniżej.

private static final String OPEN_STREET_MAP_URL_FORMAT = 
     "http://tile.openstreetmap.org/%d/%d/%d.png"; 

private void setUpMap() { 
    mMap.setMapType(GoogleMap.MAP_TYPE_NONE); 
    mMap.setMyLocationEnabled(true); 

    TileProvider tileProvider = new UrlTileProvider(256, 256) { 
     @Override 
     public synchronized URL getTileUrl(int x, int y, int zoom) { 
      String s = String.format(Locale.US, OPEN_STREET_MAP_URL_FORMAT, zoom, x, y); 
      URL url = null; 
      try { 
       url = new URL(s); 
      } catch (MalformedURLException e) { 
       throw new AssertionError(e); 
      } 
      return url; 
     } 
    }; 

    mMap.addTileOverlay(new TileOverlayOptions().tileProvider(tileProvider)); 
}