5

확인. 당신은 이것이 상대적으로 간단 할거라 생각하지만, 그렇지 않습니다.osmdroid, Maps API v2 및 단편

데이터는 자유롭게 사용, 편집 및 업데이트 할 수 있으므로 내 웹 사이트에서 공개 거리지도를 사용하고 있습니다. 내 프로젝트가이 만트라를 따르며 Google API 사용 제한/데이터 제한 저장과 함께 Google지도는 적합하지 않습니다. 나를 위해. 적어도 웹상에.

나는 내 안드로이드 앱을 따라갈 것이라고 생각했기 때문에 열린 거리지도 데이터를 사용하여 osmdroid를 설정했다.

내 활동에 멋진지도를 가질 수 있습니다. 또한 튜토리얼을 따라 갔고 적어도 tabhost/viewpager 내의 조각에서지도보기를 가질 수있는 것처럼 보였습니다. 그러나 내가 정말로 원하는 것은 (태블릿의 경우) 좌측에있는 단편에있는 식당의 목록과,이 식당이 어디에 있는지 보여주는 우측의지도 조각입니다. 내가 생각을 할 것이다, 그러나 시간과 연구의 시간 당신은 몇 가지 복잡한 코드와 일부 사용되지 않는 방법을 사용하지 않는 한이 할 수없는 제안 충분히 간단한

..

그래서 .. (지도보기를 포함) 단편로드 그리고 tabhost에서 완벽하게 실행됩니다 .. 내 활동 등에서 조각 내에서 메서드에 액세스 할 수 있습니다. 아직 단순히 두 조각을 나란히 놓을 수는 없습니다.

지금 .. 구글이 방금 API v2와 함께 나온 것을 알고 있습니다. 나는 그것을 설치하고 게임을했습니다. 실제로 osmdroid가 어떻게 작동하는지 알지 못하기 때문에 SherlockFragment 대신 MapFragment를 사용할 수 있다고 생각했습니다. ABS 사용) .. 다음 이것은 API 키 등을 요구하는 logcat 오류를 던졌다. Google지도 데이터를 사용하고 싶지 않다는 점을 감안할 때 내가 잘못 생각했다고 가정했다.

그래서 .. 사람들이 시장에서 구할 수있는 것을 사용하여 목록 조각과지도 조각을 어떻게 얻을 수 있는지 조언 할 수는 있지만 사용상의 제한이없는 오픈 소스지도 데이터를 선호하는 것이 좋습니다.

"사용 가능한 것이 무엇이며 어떻게 작동하는지"에 대한 전반적인 개요는 많은 사용자들이 매우 높이 평가할 수 있다고 확신합니다. 누군가가 조언한다면 놀라실 것입니다.

+0

없습니다 확인 this overflow out http://stackoverflow.com/questions/13695393/open-street-maps-with-android-google-maps-api-v2 – qubz

+0

길을가는 것처럼 보이지만, 더 깊이있는 설명을 찾고 있습니다. 예를 들어 내가 가장 간단한 형태로 오픈 소스 타일을 어떻게 맵핑 할 수 있을까? 그리고 그 질문에서 언급 한 것처럼 - API 사용 제한은 여전히 ​​적용된다. 기본적으로 나는이 질문을 a로 사용하는 dept 설명을 더 원한다. 환호. –

+0

이 새로운 API를 사용하는 초창기에는 osm/osmdroid 통합에 대한 가이드/예제/튜토리얼이 거의 작성되지 않았습니다. 이것은 아마 시간이 갈수록 바뀔 것입니다. – qubz

답변

11

새로운 Google지도 API가 출시되기 전에 나는 내 목적을 위해 OSMDroid를 사용해야했습니다. 그러나 그것이 무엇을했는지 (종종 부정확하게)하는 이유를 알아 내기 위해 여러 번 소스를 파헤쳐 본 후에, 나는 새로운 라이브러리로 죽어 가고있었습니다.

다행히도 새 Google지도 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); 

당신은 내 Google지도 API v2로 추가 기능 라이브러리 here이 코드의 더 공식적인 버전을 찾을 수 있습니다.

또한, 내가 당신이 당신을 기반으로한다고 생각하는 프리 프래그먼트 안드로이드 버전을 MapFragment를 사용하는 대신에 타겟팅하는 경우 SupportMapFragment를 사용해야합니다.

+0

그래서 .. 그게 날 연주 4 시간 걸렸지 만 -이 작품 : 유일한 것은 addTileProvider는 addTileOverlay 여야합니다. 아마도 osmdroid 결정/문제에 대해 자세히 설명해 주시겠습니까? - OSM 오버레이가 있지만 Google 로고가 여전히 구석에 표시됩니다. 내가 'google maps'를 사용하고 있다는 가정하에 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-fragments를 사용할 필요가 없습니다. 하나...타일은 :(캐시되지 않습니다

어쨌든, 모든 추가 /를 TileOverlayDemoActivity 클래스 업데이트는 다음과 같습니다. 사용자가 데이터를 사용하지 않을 경우 API 키를 얻기에 전혀 해를 끼치이

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