OpenStreetMap и android, пример простого приложения

Многие разработчики, по тем или иным причинам ищут альтернативы Google maps или другим крупным коммерческим сервисам. В настоящее время, наиболее известным среди таких сервисов является OpenStreetMap

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

Рассмотрим это на примере простого приложения для Android. В качестве библиотеки для работы с OpenStreetMap отлично подходит osmdroid. Я буду использовать Android Studio и Gradle.

Начнем создания нового проекта

Создаем новый проект из шаблона

Я буду использовать шаблон Navigation Drawer Activity, однако вам ничто не мешает использовать другой шаблон или вообще описать XML разметку вручную. После того как проект будет создан, потребуется добавить зависимость. Откроем файл build.gradle и добавим в него следующую строку:

dependencies {
    implementation 'org.osmdroid:osmdroid-android:6.1.5'
    [тут все остальные зависимости]
}

Обратите внимание что указана версия 6.1.5, однако это не означает что необходимо указывать именно эту версию

Синхронизируем наш проект

Пора перейти к XML разметке, откроем разметку той Activity в которой будем отображать карту, у меня это content_main.xml и добавим в него MapView, должно получится примерно следующее:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".MainActivity"
    tools:showIn="@layout/app_bar_main">

    <org.osmdroid.views.MapView
        android:id="@+id/map"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

Переходим к java классу MainActivity.java, так как Android Studio уже создала здесь весь необходимый код для работы шаблона Navigation Drawer Activity нам нужно только внести в него некоторые изменения. Начнем с метода onCreate:

    private MapView map;
    private IMapController mapController;

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

        setContentView(R.layout.activity_main);

        // Views
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); // Top bar
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); // map

        setSupportActionBar(toolbar);

        Context ctx = getApplicationContext();
        Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx));

        fab.setOnClickListener(new RefreshOnClickListener(this));

        // Drawer
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        navigationView.setNavigationItemSelectedListener(this);

        map = (MapView) findViewById(R.id.map);
        map.setLayerType(View.LAYER_TYPE_HARDWARE, null );
        map.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);

        map.setMultiTouchControls(true);
        mapController = map.getController();
        mapController.setZoom(7f);

    }

Ну вот, теперь мы можем обозревать нашу карту, перемещать и масштабировать ее. Обратите внимание я вынес MapView map и IMapController mapController в приватные поля класса, это упростит нам дальнейшую работу с ними (Об этом в следующей статье)

Поделиться этим материалом