Використання спеціальних плиток карт за допомогою Google Map API V2 для Android.


10

Я шукаю спосіб використання користувацьких плиток карт за допомогою Google Map API V2 для Android.

Я пишу заявку, яка створюватиме власні карти в режимі реального часу з даними, що надходять від робота.

У програмі потрібно показати оператору цю карту. Операторові необхідно взаємодіяти з цією картою, випускаючи точки та ін.

Я хочу використовувати двигун GoogleMap, щоб зробити те саме, що і ця сторінка:

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

Проблема полягає в тому, що він використовував API Javascript, коли я хочу використовувати API Android

Чи є можливість використовувати власну карту плиток на android за допомогою Google Maps Engine?

Я вже дивлюся на те, як використовувати ArcGIS, але я вважаю за краще використовувати API, не платячи за ліцензію.

Відповіді:


8

Так, ви можете використовувати спеціальні плитки з Android Maps API v2 - ви можете побачити повноцінний приклад у нашому OpenTripPlanner для Android додатку на Github . (Ви також можете завантажити додаток безпосередньо з Google Play )

Ми підтримуємо наступних постачальників плиток:

  • LyrkOpenStreetMap
  • MapQuestOpenStreetMap
  • Mapnik
  • 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: введіть тут опис зображення

Для отримання додаткової інформації про створення власних плиток див. Документацію Google для TileOverlay , а також вікі OpenStreetMap для "Створення власних плиток" .

Зокрема, в документації Google написано:

Зауважте, що світ проектується за допомогою проекції Меркатора (див. Вікіпедія) лівою (західною) стороною карти, що відповідає -180 градусів довготи, і правою (східною) стороною карти, що відповідає 180 градусам довготи. Щоб зробити карту площею, верхній (північній) стороні карти відповідає 85.0511 градусів широти, а нижній (південній) стороні карти відповідає -85.0511 градусів широти. Області поза цим діапазоном широти не відображаються.

На кожному рівні збільшення карта поділяється на плитки і завантажуються та надаються лише плитки, які перекриваються екраном. Кожна плитка є квадратною, а карта поділена на плитки наступним чином:

  • При рівні масштабу 0 одна плитка представляє весь світ. Координати цієї плитки є (x, y) = (0, 0).

  • На рівні масштабу 1 світ поділяється на 4 плитки, розташовані в сітці 2 х 2. ...

  • На рівні масштабу N світ поділяється на 4N плитки, розташовані в сітці 2N x 2N.

Зауважте, що мінімальний рівень збільшення, який підтримує камера (який може залежати від різних факторів), є GoogleMap.getMinZoomLevel, а максимальний рівень збільшення - GoogleMap.getMaxZoomLevel.

Координати плиток вимірюються у верхньому лівому (північно-західному) куті карти. На рівні масштабу N значення x координат плитки коливаються від 0 до 2N - 1 і збільшуються із заходу на схід, а значення y змінюються від 0 до 2N - 1 і збільшуються з півночі на південь.

Відформатовані URL-адреси, які використовуються в OTP Android для посилання на кожного постачальника плиток, виглядають так:

Отже, для вищезазначених постачальників зображення плитки - це файли PNG, розташовані в структурі каталогів, зазначеній в документації Google. Ви б дотримувались подібного формату, щоб створити власну плитку карти, розміщену на власному сервері. Зауважте, що ці URL-адреси / зображення повинні бути загальнодоступними для мобільного пристрою (тобто не можуть бути захищені паролем).


Дякуємо за ваш час. Можна використовувати повністю створені мною образи в особистому сховищі? Який формат цієї плитки? А дендропарк?
MonkeyJLuffy

@MonkeyJLuffy Я просто додав інформацію внизу своєї відповіді на це. Будь ласка, дайте мені знати, якщо у вас залишаються питання після прочитання цього запиту.
Шон Барбо

1

Саме велике рішення , яке я знайшов в цьому StackOverflow Відповідь :

В основному вам потрібно реалізувати власний TileProvider і використовувати його як TileOverlay

У кількох програмах ми використовували такий шар, щоб показувати плитки на карті, але ми виявили, що плитки займають багато місця. Тому ми перейшли до використання mbtiles і цієї бібліотеки для відображення даних з mbtiles на карті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.