Как выделить строку (или полигон) в Mapbox Android из GeoJSON или mapboxId

#android #kotlin #mapbox #mapbox-android #mapbox-android-maps

#Android #kotlin #mapbox #mapbox-android #mapbox-android-карты

Вопрос:

Я пытаюсь выделить объект на карте с помощью Mapbox Android SDK. Сначала карта загружается в приложение с использованием пользовательских стилей с сервера векторных плиток.

Чтобы выделить объект, данные поступают с сервера с координатами и данными объекта, хранящимися в базе данных. Приложение Android получает GeoJSON следующим образом:

 {
    …
    "geometry":{
        [enter image description here][1]"type":"LineString",
        "coordinates":[
            [-6.280378997325897,36.52107960787673],[-6.280381679534912,36.52104619723205], 
            [-6.280373632907867,36.52102787525949]
        ]
    },
    "mapboxId":487
    …
}
  

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

 when (current.getGeometryType()) {
            POINT -> …
            LINE_STRING -> marker.geometry =  LineString.fromJson(current.getGeometry())
                …
}
  

Затем я добавляю источник и слой с некоторыми свойствами.

 style.apply {
            addSource(
                GeoJsonSource(
                    SOURCE_ID3_RED_BORDER,
                    FeatureCollection.fromFeatures(marker)
                )
            )
            addLayer(
                LineLayer(
                    LAYER_ID3_RED_BORDER,
                    SOURCE_ID3_RED_BORDER
                )
                    .withProperties(
                        PropertyFactory.lineGapWidth(5f),
                        PropertyFactory.lineJoin(Property.LINE_JOIN_ROUND),
                        PropertyFactory.lineCap(Property.LINE_CAP_ROUND),
                        PropertyFactory.lineWidth(2f),
                        PropertyFactory.lineColor(Color.RED)
                    )
            )
        }
  

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

см. Изображение

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

Есть ли способ добиться этого? Похоже, это похоже на пример «Выбрать здание» (https://docs.mapbox.com/android/maps/examples/select-a-building /) но объект, который должен быть выделен, определяется не выбором пользователя, а известными данными объекта, поступающими с сервера при загрузке вида карты.

Ответ №1:

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

введите описание изображения здесь

В этой части у вас достаточно координат. В остальных случаях вы этого не делаете.