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