12.2. NextGIS Android SDK v3

12.2.1. Введение

NextGIS Android SDK это набор библиотек для работы с геоданными в мобильном приложении для Android. В состав библиотек входят:

Библиотека nextgis_datastore написана на С++11 и основана на GDAL. Она обеспечивает следующие возможности:

  • создание, изменение и удаление геоданных (растровых и векторных)
  • редактирование геоданных (модификация географии и атрибутики)
  • управление геоданными (копирование, перенос, изменение формата и др.)
  • визуализацию геоданных в виде карт при помощи OpenGL/OpenGL ES
  • вспомогательные функции (работа с сетью, oAuth2, json)
  • интеграция с nextgis.com/NextGIS Web (under development now)

Для взаимодействия с библиотекой используется С API и биндинги для android java/kotlin при помощи jni.

Библиотека android_maplib написана на Kotlin и представляет собой удобную обвязку вокруг C API nextgis_datastore.

12.2.2. Установка

Для использования SDK необходимо Android Studio. Для использования SDK необходимо подключить его к проекту.

12.2.3. Подключение к проекту

Для подключения NextGIS Mobile SDK выполните следующие шаги:

  1. Запустите Android Studio.
  2. Откройте файл build.gradle вашего приложения.
  3. Убедитесь что параметр minSdkVersion в проекте соответсвует API уровня 14 или выше.
  4. В блоке зависимостей добавть новую строку вида:
dependencies {
  implementation 'com.nextgis.maplib:maplib:3.0.+'
}

12.2.4. Добавлениe карты

Для добавления карты в приложение необходимо:

  1. Как можно раньше в коде вызвать инициализацию библиотеки:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    
        API.init(this@MainActivity)
    }
    
  2. Добавить MapView в компановку окна:

    <com.nextgis.maplib.MapView
         android:id="@+id/mapView"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
    
  3. Создать или открыть файл карты:

    val map = API.getMap("main")
    
  4. Связать карту с окном и включить отрисовку (по-умолчанию отрисовка отключена):

    val mapView = findViewById<MapView>(R.id.mapView)
    if(mapView != null) {
        mapView.setMap(map)
    }
    mapView.freeze = false
    

12.2.5. Создание векторного слоя

Для создания векторного слоя необходимо выполнить ряд шагов:

  1. Получить или создать хранилище. Имя хранилища может быть любым (например, store).

    val dataStore = API.getStore("store")
    
  2. Создать в хранилище векторный слой с необходимой структурой.

    val options = mapOf(
      "CREATE_OVERVIEWS" to "ON",
      "ZOOM_LEVELS" to "2,3,4,5,6,7,8,9,10,11,12,13,14"
    )
    
    val fields = listOf(
      Field("long", "long", Field.Type.REAL),
      Field("lat", "lat", Field.Type.REAL),
      Field("datetime", "datetime", Field.Type.DATE, "CURRENT_TIMESTAMP"),
      Field("name", "name", Field.Type.STRING)
    )
    
    val pointsFC = dataStore.createFeatureClass("points", Geometry.Type.POINT, fields, options)
    
  3. Загрузить в созданный слой геоданные.

    // Сформируем массив координат
    data class PtCoord(val name: String, val x: Double, val y: Double)
    val coordinates = listOf(
      PtCoord("Moscow", 37.616667, 55.75),
      PtCoord("London", -0.1275, 51.507222),
      PtCoord("Washington", -77.016389, 38.904722),
      PtCoord("Beijing", 116.383333, 39.916667)
    )
    
    // Преобразуем систему координат из EPSG:4326 в EPSG:3857
    val coordTransform = CoordinateTransformation.new(4326, 3857)
    
    for(coordinate in coordinates) {
      val feature = pointsFC.createFeature()
      if(feature != null) {
        val geom = feature.createGeometry() as? GeoPoint
        if(geom != null) {
          val point = Point(coordinate.x, coordinate.y)
          val transformPoint = coordTransform.transform(point)
          geom.setCoordinates(transformPoint)
          feature.geometry = geom
          feature.setField(0, coordinate.x)
          feature.setField(1, coordinate.y)
          feature.setField(3, coordinate.name)
          pointsFC.insertFeature(feature)
        }
      }
    }
    

12.2.6. Загрузка векторного слоя

Для загрузки векторного слоя в хранилище из файла ГИС формата необходимо выполнить следующие шаги:

  1. Получить или создать хранилище. Имя хранилища может быть любым (например, store).

    val dataStore = API.getStore("store")
    
  2. Получить из каталога ссылку на файл ГИС формата и скопировать его в хранилище.

    val tmpDir = API.getTmpDirectory()
    val testGeojsonObj = tmpDir?.child("test.geojson")
    val copyOptions = mapOf(
      "CREATE_OVERVIEWS" to "ON",
      "NEW_NAME" to "trees"
    )
    
    val createResult = testGeojsonObj?.copy(Object.Type.FC_GPKG, store!!, true, copyOptions) ?: false
    val treesFC = Object.forceChildToFeatureClass(store?.child("trees")!!)
    

12.2.7. Создание растрового слоя

Для создания растрового слоя необходимо задать следующие сведения:

  • охват растрового слоя

  • имя слоя

  • URL к источникам тайлов XYZ

  • минимальный и максимальный уровни увеличения (zoom level)

  • система координат слоя EPSG

    val bbox = Envelope(-20037508.34, 20037508.34, -20037508.34, 20037508.34)
    val baseMap = dataDir.createTMS("osm.wconn", "http://tile.openstreetmap.org/{z}/{x}/{y}.png",
                  3857, 0, 18, bbox, bbox, 14)
    

12.2.8. Создание слоя на карте со стилем

Для добавления слоя в карту необходимо выполнить:

  1. Добавить векторный слой в карту

    val pointsLayer = map.addLayer("Points", pointsFC)
    
  2. Установить тип стиля

    pointsLayer.styleName = "pointsLayer"
    
  3. Настроить свойства стиля

    val style = pointsLayer.style
    style.setString("color", colorToHexString(Color.rgb(0, 190,120)))
    style.setDouble("size", 8.0)
    style.setInteger("type", 6) // Star symbol
    
  4. Применить модифицированный стиль к слою

    pointsLayer.style = style
    

12.2.9. Документация по API

Подробнее по работе с библиотекой см. документацию по API.

12.2.10. Демо проекты

Демо проекты размещены на отдельной странице.