Подтвердить что ты не робот

Как создать карту из OpenStreetMap в автономном режиме, отобразить ее на Android?

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

Можно ли использовать Mapnik? Ваша помощь будет большой благодарностью.

4b9b3361

Ответ 1

В настоящее время я разрабатываю (мое первое) приложение для 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, поэтому я никоим образом не специалист по этому вопросу, и я могу только прокомментировать, что сработало для меня.

Надеюсь, это поможет вам начать работу.

EDIT:

У меня не было возможности фактически запустить код, который я написал вчера, поэтому я не поймал несколько ошибок. Я только что создал новый проект в 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 ... />.

Кроме того, обязательно импортируйте следующие две библиотеки 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 мой код продолжал сбой, пока я не запомнил его включение.

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

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

Ответ 2

Существует пошаговое решение:

Вкратце:

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" />

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

Ответ 3

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