5

確定。你會認爲這會比較簡單,但不會。osmdroid,地圖API v2和片段

我在我的網站上使用開放式街道地圖,因爲數據可以免費使用,編輯和更新 - 我的項目遵循這個口頭禪,並且與Google使用API​​使用限制/保存數據限制一起,谷歌地圖根本不適合對我來說,至少在網絡上。

鑑於這種我想我會效仿我的Android應用程序,所以我設置osmdroid利用開放街道地圖數據。

我可以在我的活動一個很好的地圖。我也跟着教程,它似乎至少這樣的工作,我可以在一個片段tabhost/viewpager內的地圖視圖。然而,我真正想要的(對於平板電腦),是左側片段中的機構列表,右側是地圖片段,顯示了這些機構的位置。

夠簡單了,我會想到,但小時的研究時間建議,除非你使用一些複雜的代碼和一些過時的方法,這是不可能的..

所以..片段(包含地圖視圖)負載並在tabhost中完美運行..我可以從我的活動等訪問片段內的方法..但沒有什麼只是簡單地有兩個片段並排。

現在..我知道谷歌剛剛出來與他們的API v2 ..我安裝它,並有一個戲..不知道如何osmdroid的作品,我想我可以更新,所以我有MapFragment而不是SherlockFragment(我使用ABS)..然後,這只是扔了logcat錯誤要求API密鑰等..並給予我不想使用谷歌地圖數據,我認爲我出了問題。

所以..誰能告訴我如何獲得一個列表片段和地圖片段並排使用市場上可用的任何東西,但最好是利用開源地圖數據,使他們沒有使用限制。

我敢肯定,「有什麼可用的,以及它是如何工作的」整體概述將非常讚賞大量的用戶..所以如果任何人可以建議它會是驚人的!

+0

有在得到,如果你的不打算使用他們的數據的API密鑰不傷害檢查出這溢出http://stackoverflow.com/questions/13695393/open-street-maps-with-android-google-maps-api-v2 – qubz

+0

這似乎是要走的路,但即時通訊尋找更深入的解釋至於它的工作方式,例如我將如何以最簡單的形式實現一個帶有開源代碼塊的地圖?並且正如在這個問題中提到的那樣 - api的使用限制仍然適用,基本上我希望更多的使用這個問題的部門解釋作爲基地..乾杯。 –

+0

由於這是新的API的早期版本,所以很少有關於osm/osmdroid與其集成的指南/示例/教程。隨着時間的推移,這可能會改變。 – qubz

回答

11

新的谷歌地圖API出來之前,我被迫使用OSMDroid我的目的。然而,經過多次挖掘來源以找出它爲什麼會這樣做(通常不正確)之後,我急需一個新的圖書館。

幸運的是,新的谷歌地圖API符合該法案。您可以在應用程序中使用Google Maps API v2,而不必使用Google的底圖,但是,不幸的是,您必須首先獲取API密鑰。

我假設你想使用OpenStreetMap的作爲在線地圖來源,所以下面的代碼將實現這一量身定做。

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); 

您可以在我的谷歌地圖API第2版的附加組件庫here一本規範的更正規的版本。另外,如果您的目標是預碎片Android版本,我相信您基於您使用ABS,而不是使用MapFragment,請確保使用SupportMapFragment。

+0

所以..它讓我玩了4個小時 - 但這個工作:)唯一錯誤的是addTileProvider應該是addTileOverlay .. 你可能會詳細說明你的osmdroid決定/問題嗎? 另外 - 我有OSM疊加層,但Google徽標仍顯示在角落。鑑於我仍在使用「谷歌地圖」,您是否知道在歸因於OSM方面需要做些什麼?此外,我會假設我仍然受其使用上限的限制?否定OSM的主要好處之一 無論如何,非常感謝 - 非常感謝! –

+1

我認爲Google徽標是一個錯誤,我在此提交了一個問題:http://code.google.com/p/gmaps-api-issues/issues/detail?id=4648。 關於爲什麼不是OSMDroid,它基本上歸結爲性能,錯誤和缺乏文檔。如果你想知道自己爲什麼,可以查看源代碼,看看有多少空操作可以通過/ TODO評論找到。 ;) – cocoahero

+1

也已經處理OSMdroid的問題,我正在考慮這種用法。現在你已經有一段時間了,這是如何工作的? – Patrick

3

Google Maps Android API v2一起發送的Sample Code包含類com.example.mapdemo.TileOverlayDemoActivity。我對這個類的小小更新將在新的v2框架中顯示OpenStreetMap切片。涼!不再需要使用osmdroid或sherlock碎片。然而...瓷磚不會被緩存:(

不管怎樣,所有添加/更新到TileOverlayDemoActivity類如下所示:

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)); 
}