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 Maps Engineを使用してAndroidでカスタムタイルマップを使用する方法はありますか?

私はすでにArcGISの使用方法を検討していますが、ライセンスを支払うことなくAPIを使用することを好みます。

回答:


8

はい、Android Maps API v2でカスタムタイルを使用できます。GithubのOpenTripPlanner for Androidアプリで完全に機能する例を見ることができます。(またできるGoogleのプレイから直接アプリをダウンロードしてください

次のタイルプロバイダーをサポートしています。

  • LyrkOpenStreetMap
  • MapQuestOpenStreetMap
  • マプニク
  • CycleMap
  • 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 wikiを参照してください

具体的には、Googleのドキュメントには次のように書かれています。

世界はメルカトル図法(Wikipediaを参照)を使用して投影され、マップの左側(西)は経度-180度に対応し、マップの右側(東)は経度180度に対応します。マップを正方形にするために、マップの上(北)側は85.0511度の緯度に対応し、マップの下(南)側は-85.0511度の緯度に対応します。この緯度の範囲外の領域はレンダリングされません。

各ズームレベルで、マップはタイルに分割され、画面に重なるタイルのみがダウンロードされてレンダリングされます。各タイルは正方形であり、マップは次のようにタイルに分割されています。

  • ズームレベル0では、1つのタイルが世界全体を表します。そのタイルの座標は(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 /画像は、モバイルデバイスからパブリックにアクセスできる必要があります(つまり、パスワードで保護することはできません)。


お時間をいただきありがとうございます。私が完全に作成した画像を個人のリポジトリで使用することはできますか?そのタイルのフォーマットは何ですか?そして樹木?
MonkeyJLuffy 14

@MonkeyJLuffy私はこれに対する私の答えの下部にいくつかの情報を追加しました。これを読んだ後、まだ質問がある場合はお知らせください。
Sean Barbeau 14

0

私が見つけた最も広範なソリューションは、このStackOverflow Answerにあります:

基本的には、独自の実装に必要なTileProviderそのようおよび使用をTileOverlay

いくつかのアプリケーションでは、この種のレイヤーを使用してマップにタイルを表示しましたが、タイルが多くのスペースを占めることがわかりました。そのため、mbtileとこのライブラリを使用して、mbtileのデータを地図に表示するようにしました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.