Android 용 Google Map API V2에서 맞춤지도 타일을 사용하십니까?


10

Android 용 Google Map API V2에서 맞춤지도 타일을 사용하는 방법을 찾고 있습니다.

로봇에서 오는 데이터로 실시간으로 자체지도를 만드는 응용 프로그램을 작성 중입니다.

애플리케이션은 운영자에게이 맵을 보여 주어야합니다. 운영자는이지도와 상호 작용하여 웨이 포인트 등을 허용해야합니다.

이 페이지와 동일한 작업을 수행하기 위해 GoogleMap 엔진을 사용하고 싶습니다.

http://cdn.mikecouturier.com/blog.mikecouturier.com/tilesgenerator/index.html

문제는 Android API 를 사용하려고 할 때 Javascript API 를 사용했다는 것입니다.

Google지도 엔진을 사용하여 Android에서 맞춤 타일지도를 사용하는 방법이 있습니까?

ArcGIS 사용 방법을 이미보고 있지만 라이센스 비용을 지불하지 않고 API를 사용하는 것을 선호합니다.

답변:


8

예, Android Maps API v2 와 함께 맞춤 타일을 사용할 수 있습니다 . Github의 Android 용 OpenTripPlanner 앱 에서 전체 예제를 볼 수 있습니다 . ( Google Play에서 직접 앱을 다운로드 할 수도 있습니다 )

다음과 같은 타일 공급자를 지원합니다.

  • LyrkOpenStreetMap
  • MapQuestOpenStreetMap
  • 마프 닉
  • 사이클 맵
  • Google (일반, 위성, 하이브리드, 지형)

CustomUrlTileProvider 클래스는 여기 Github 에서 볼 수 있으며 아래에 붙여 넣었습니다.

public class CustomUrlTileProvider extends UrlTileProvider {

    private String baseUrl;

    public CustomUrlTileProvider(int width, int height, String url) {
        super(width, height);
        this.baseUrl = url;
    }

    @Override
    public URL getTileUrl(int x, int y, int zoom) {
        try {
            return new URL(baseUrl.replace("{z}", "" + zoom).replace("{x}", "" + x)
                    .replace("{y}", "" + y));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

그리고 여기에 코드의 사용자 선호도에 따라,지도 타일 공급자 사이를 전환 :

/**
 * Changes the tiles used to display the map and sets max zoom level.
 *
 * @param overlayString tiles URL for custom tiles or description for
 *                      Google ones
 */
public void updateOverlay(String overlayString) {
    int tile_width = OTPApp.CUSTOM_MAP_TILE_SMALL_WIDTH;
    int tile_height = OTPApp.CUSTOM_MAP_TILE_SMALL_HEIGHT;

    if (overlayString == null) {
        overlayString = mPrefs.getString(OTPApp.PREFERENCE_KEY_MAP_TILE_SOURCE,
                mApplicationContext.getResources()
                        .getString(R.string.map_tiles_default_server));
    }
    if (mSelectedTileOverlay != null) {
        mSelectedTileOverlay.remove();
    }
    if (overlayString.startsWith(OTPApp.MAP_TILE_GOOGLE)) {
        int mapType = GoogleMap.MAP_TYPE_NORMAL;

        if (overlayString.equals(OTPApp.MAP_TILE_GOOGLE_HYBRID)) {
            mapType = GoogleMap.MAP_TYPE_HYBRID;
        } else if (overlayString.equals(OTPApp.MAP_TILE_GOOGLE_NORMAL)) {
            mapType = GoogleMap.MAP_TYPE_NORMAL;
        } else if (overlayString.equals(OTPApp.MAP_TILE_GOOGLE_TERRAIN)) {
            mapType = GoogleMap.MAP_TYPE_TERRAIN;
        } else if (overlayString.equals(OTPApp.MAP_TILE_GOOGLE_SATELLITE)) {
            mapType = GoogleMap.MAP_TYPE_SATELLITE;
        }
        mMap.setMapType(mapType);
        mMaxZoomLevel = mMap.getMaxZoomLevel();
    } else {
        if (overlayString.equals(getResources().getString(R.string.tiles_mapnik))) {
            mMaxZoomLevel = getResources().getInteger(R.integer.tiles_mapnik_max_zoom);
        } else if (overlayString.equals(getResources().getString(R.string.tiles_lyrk))) {
            mMaxZoomLevel = getResources().getInteger(R.integer.tiles_lyrk_max_zoom);
            tile_width = OTPApp.CUSTOM_MAP_TILE_BIG_WIDTH;
            tile_height = OTPApp.CUSTOM_MAP_TILE_BIG_HEIGHT;
        } else {
            mMaxZoomLevel = getResources().getInteger(R.integer.tiles_maquest_max_zoom);
        }

        mMap.setMapType(GoogleMap.MAP_TYPE_NONE);
        CustomUrlTileProvider mTileProvider = new CustomUrlTileProvider(
                tile_width,
                tile_height, overlayString);
        mSelectedTileOverlay = mMap.addTileOverlay(
                new TileOverlayOptions().tileProvider(mTileProvider)
                        .zIndex(OTPApp.CUSTOM_MAP_TILE_Z_INDEX));

        if (mMap.getCameraPosition().zoom > mMaxZoomLevel) {
            mMap.moveCamera(CameraUpdateFactory.zoomTo(mMaxZoomLevel));
        }
    }
}

다음은 MapQuest OpenStreetMap 타일의 스크린 샷입니다. 여기에 이미지 설명을 입력하십시오

나만의 타일 만들기에 대한 자세한 내용 은 TileOverlay에 대한 Google 설명서 와 "나만의 타일 만들기"에 대한 OpenStreetMap 위키를 참조하십시오 .

구체적으로, 구글 문서는 다음과 같이 말합니다 :

세계는 -180 도의 경도에 해당하는지도의 왼쪽 (서쪽)과 경도의 180도에 해당하는지도의 오른쪽 (동쪽)에 메르카토르 투영법 (위키 백과 참조)을 사용하여 투영됩니다. 지도를 정사각형으로 만들려면지도의 상단 (북쪽)은 위도 85.0511도에 해당하고지도의 하단 (남쪽)은 -85.0511도에 해당합니다. 이 위도 범위를 벗어난 영역은 렌더링되지 않습니다.

각 확대 / 축소 수준에서지도는 타일로 분할되며 화면과 겹치는 타일 만 다운로드하여 렌더링합니다. 각 타일은 정사각형이며 맵은 다음과 같이 타일로 나뉩니다.

  • 확대 / 축소 수준 0에서 하나의 타일은 전 세계를 나타냅니다. 해당 타일의 좌표는 (x, y) = (0, 0)입니다.

  • 확대 / 축소 수준 1에서 세계는 2 x 2 격자로 배열 된 4 개의 타일로 나뉩니다. ...

  • 확대 / 축소 수준 N에서 월드는 2N x 2N 그리드로 배열 된 4N 타일로 나뉩니다.

카메라가 지원하는 최소 줌 레벨 (다양한 요인에 따라 다름)은 GoogleMap.getMinZoomLevel이고 최대 줌 레벨은 GoogleMap.getMaxZoomLevel입니다.

타일의 좌표는지도의 왼쪽 상단 (북서쪽)에서 측정됩니다. 확대 / 축소 수준 N에서 타일 좌표의 x 값 범위는 0에서 2N-1 사이이고 서쪽에서 동쪽으로 증가하고 y 값의 범위는 0에서 2N-1 사이이며 북쪽에서 남쪽으로 증가합니다.

각 타일 제공자를 참조하기 위해 OTP Android에서 사용되는 형식화 된 URL은 다음과 같습니다.

따라서 위의 공급자의 경우 타일 이미지는 Google 문서에 표시된 디렉토리 구조로 배열 된 PNG 파일입니다. 자체 서버에서 호스팅되는 자체지도 타일을 만들려면 비슷한 형식을 따릅니다. 이 URL / 이미지는 모바일 장치에서 공개적으로 액세스 할 수 있어야합니다 (즉, 암호로 보호 할 수 없음).


시간 내 주셔서 감사합니다. 나에 의해 완전히 만들어진 이미지를 개인 저장소에서 사용할 수 있습니까? 그 타일의 형식은 무엇입니까? 그리고 arborescence?
MonkeyJLuffy

@MonkeyJLuffy 방금 답변을 맨 아래에 추가했습니다. 이 내용을 읽은 후에도 여전히 질문이 있으면 알려주십시오.
Sean Barbeau

1

내가 찾은 가장 광범위한 솔루션은이 StackOverflow Answer입니다 .

기본적으로 고유 한 TileProvider 를 구현 하고이를 TileOverlay 로 사용해야합니다.

몇 가지 응용 프로그램에서 이러한 종류의 레이어를 사용하여지도에 타일을 표시했지만 타일이 많은 공간을 차지한다는 것을 알았습니다. 따라서 우리는 mbtiles 와이 라이브러리 를 사용하여 mbtiles 의 데이터를 맵에 표시했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.