Как создать плитку карты из OpenStreetMap в автономном режиме, отобразить ее на Android? - PullRequest
18 голосов
/ 02 октября 2011

Я хочу отобразить простую автономную карту с помощью OpenStreetMap.Я не могу найти в Интернете правильные инструменты для создания листов карты и использовать их для отображения карты в Android.Я скачал разные ресурсы, но, похоже, понятия не имею, с чего начать.Я хочу интегрировать изображения из OpenStreetMap с помощью JOSM, но я не знаю, смогу ли я использовать его на Android.

Могу ли я использовать Mapnik?Ваша помощь будет большое спасибо.

Ответы [ 3 ]

26 голосов
/ 04 октября 2011

В настоящее время я разрабатываю (мое первое) приложение для Android с использованием API OpenStreetMap (OSM), поэтому, хотя я не могу помочь вам с JSOM, я могу попытаться помочь с частью OSM:

Предполагая, что вы хотите создать новое действие в своем приложении для Android, которое просто отображает карту OSM, вы можете начать с чего-то вроде этого:

package example.stackoverflow.osmdroid;

import android.app.Activity;
import android.os.Bundle;

import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;

public class YourMap extends Activity {
    // The MapView variable:
    private MapView m_mapView;

    // Default map zoom level:
    private int MAP_DEFAULT_ZOOM = 15;

    // Default map Latitude:
    private double MAP_DEFAULT_LATITUDE = 38.535350;

    // Default map Longitude:
    private double MAP_DEFAULT_LONGITUDE = -121.753807;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Specify the XML layout to use:
        setContentView(R.layout.osm_map);

        // Find the MapView controller in that layout:
        m_mapView = (MapView) findViewById(R.id.mapview);

        // Setup the mapView controller:
        m_mapView.setBuiltInZoomControls(true);
        m_mapView.setMultiTouchControls(true);
        m_mapView.setClickable(true);
        m_mapView.setUseDataConnection(false);
        m_mapView.getController().setZoom(MAP_DEFAULT_ZOOM);
        m_mapView.getController().setCenter(
            new GeoPoint(MAP_DEFAULT_LATITUDE, MAP_DEFAULT_LONGITUDE));
        m_mapView.setTileSource(TileSourceFactory.MAPNIK);
    } // end onCreate()
} // end class YourMap

Где ваш макет osm_map.xml может выглядеть примерно так:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <org.osmdroid.views.MapView
            android:id="@+id/mapview"
            android:layout_width="match_parent" 
            android:layout_height="match_parent"
            android:enabled="true"      
            android:clickable="true"
        />  
</RelativeLayout>

Что касается настоящих плиток карты, то есть действительно классная программа под названием Mobile Atlas Creator , которая позволяет создавать необходимые фрагменты карты для автономной карты Android, реализованной выше.

После того, как вы установили приложение и хотите создать новый атлас, вам будет предложено выбрать «желаемый формат альт».Когда это всплывет, выберите «Osmdroid zip».

Как только все загрузится, выберите регион на карте, для которого вы хотите создать плитки, выберите уровни масштабирования, для которых вы хотите использовать плитки, и нажмите кнопку «Добавить выделение» в столбце слева, а затем"Создать Атлас".

Да, и, в зависимости от источника, вам может потребоваться установить флажок «Создать / настроить плитки карты», чтобы принудительно экспортировать плитки в формате PNG - кто-нибудь знает, возможно ли использовать JPG с OSM??

После того, как ZIP был сгенерирован, я переименовал его в «Mapnik.zip» и переместил во вновь созданную папку «плитки» в моей рабочей области проекта Eclipse Android.Чтобы заставить его работать, мне также пришлось открыть zip-файл и переименовать папку верхнего уровня из чего-то вроде «Google Earth» (в зависимости от используемого вами источника карты) в «Mapnik», чтобы плиткаотобразить в моем приложении для Android.

Для того, чтобы на самом деле загрузить плитки на ваш телефон, однако, вам нужно будет использовать инструмент ADB из терминала.В вашем каталоге инструментов ADB вы захотите запустить что-то вроде этого (каждая строка - новая команда):

./adb shell rm -r /sdcard/osmdroid/
./adb shell mkdir /sdcard/osmdroi/
./adb push ~/path/to/your/mapnik.zip /sdcard/osmdroid

В зависимости от размера карты и скорости шины памяти телефона, этопоследний шаг может занять от нескольких минут до часа.После этого ваша карта должна работать - я надеюсь!

Как я уже упоминал, я впервые использую API OSM, поэтому я ни в коем случае не эксперт в этом, и я могуТолько прокомментируйте, что сработало для меня.

Надеюсь, это поможет вам начать!

РЕДАКТИРОВАТЬ:

У меня не было шансана самом деле запустить код, который я написал вчера, поэтому я не уловил несколько ошибок.Я просто создал новый проект в Eclipse, поместил туда свой код, исправил несколько вещей и запустил его.Все сделанные мной изменения отражены в приведенном выше коде!Я забыл несколько основных операторов импорта и забыл добавить разрешения для файла manifest.xml.

Последние несколько строк моего manifest.xml теперь выглядят так:

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>

И вы также можете добавить это в манифест, хотя, конечно, не критично:

<supports-screens 
    android:anyDensity="true"
    android:resizeable="false"
    android:largeScreens="true"
    android:normalScreens="true"
/>

Добавьте это сразу после <uses-sdk ... /> part.

Кроме того, обязательно импортируйте следующие две библиотеки JAR:

osmdroid-android-3.0.3.jar // Or whatever version you're using...

и

slf4j-android-1.5.8.jar // Or whatever the latest version is...

Без этого последнего JAR мой код продолжал падать, пока я не запомнил его включение.

Обязательно измените координаты по умолчанию, чтобы они указывали на местоположение, для которого у вас действительно есть листы карты, в противном случае вы ничего не увидите, кроме белого холста.

Извините, что сначала не запускаю код на моем конце!

6 голосов
/ 23 августа 2015

Вот пошаговое решение:

Вкратце:

1 - Вы должны загрузить плитки карты, используя Mobile Atlas Creator .Я объяснил шаги ЗДЕСЬ

2- Переместите получившийся zip-файл на /mnt/sdcard/osmdroid/ на вашем устройстве.

3- Добавление osmdroid-android-XXX.jar и slf4j-android-1.5.8.jar в пути сборки вашего проекта

4- Добавление MapView: вы можете добавить MapView в свой макет xml

<org.osmdroid.views.MapView
    android:id="@+id/mapview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tilesource="Mapnik"
    />

Или создать MapView программно:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    mResourceProxy = new ResourceProxyImpl(inflater.getContext().getApplicationContext());
    mMapView = new MapView(inflater.getContext(), 256, mResourceProxy);
    return mMapView;
}

Не забудьте добавить эти разрешения в свой манифест:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Это хороший примерПроект .Надеюсь, что это поможет;)

Важно

Как упомянул @Scai: недавно Open Street Map объявила, что этот инструмент не годится и возникли некоторые проблемы:

Этот инструмент приводит к интенсивному трафику для серверов плиток OSM и, вероятно, будет заблокирован.Пожалуйста, не используйте его.

1 голос
/ 28 ноября 2016

Вместо карты плитки вы также можете использовать векторные данные для автономной карты, например mapsforge или Mapbox Android SDK.Для получения дополнительной информации обратитесь к вики OSM о автономных библиотеках OSM и Android .

...