Mapbox Android - Как нарисовать многоугольник GeoJSON с отверстиями

Мне нужно нарисовать поли GeoJSON с отверстиями на карте Mapbox Android SDK.

Как сказано в спецификации GeoJSON,

Для типа «Многоугольник» элемент «координаты» должен быть массивом массивов координат LinearRing. Для многоугольников с несколькими кольцами первое должно быть внешним кольцом, а все остальные должны быть внутренними кольцами или отверстиями.

В Leaflet, Mapbox JS и Mapbox GL JS загрузкой файлов GeoJSON занимается сама библиотека. Как видно из этой скрипки, библиотека учитывает внутренние кольца и, таким образом, правильно рисует дыры.

      [ //Outer ring
        [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]
      ],
      [ //Inner ring (hole)
        [100.35, 0.35], [100.65, 0.35], [100.65, 0.65], [100.35, 0.65], [100.35, 0.35]
      ]

Когда я смотрю на Android-документацию о рисовании полигонов, я не вижу никакой информации о дырах. В приведенном ими примере просто перебирают все точки и строят из них PolyOptions: Рисование многоугольника в Mapbox Android.

Я пытался построить polyOptions, добавляя все точки из внешнего кольца, а затем из внутренних колец, одну за другой. С простым geoJSON от JSFiddle работает, пробивает дыру. Но с моим более сложным geoJSON весь рендеринг нарушен (форма не похожа на то, что должно).

После этого я попытался построить по одному отдельному полигону для каждого кольца geoJSON. Форма конечно хорошая, но дырок нет, а вместо них сложены полигоны.

Я искал другие варианты PolygonOptions, но не может быть отправлено ничего, кроме точек. Я думал о том, чтобы нарисовать все многоугольники, а затем вычесть формы, но я не нашел такой функции < / а>.

Вот мой GeoJSON. Он отлично рисует на mapbox JS. Мне интересно, если что-то не так с моим GeoJSON, но я так не думаю, так как он отлично работает на geojson.io. Возможно, мне что-то не хватает в geoJSON или mapbox. Я не нашел документации по этому поводу. Я подумываю о переходе на карты Google, но это будет означать перезапуск всего проекта с нуля.

Любая идея ?


person Rayjax    schedule 11.03.2016    source источник
comment
Возможно, я ошибаюсь, но Mapbox определяет Polygon как аннотацию геометрии, которая представляет собой замкнутый цикл координат., И, согласно справочнику API, нет возможности добавлять дыры в полигоны ...   -  person antonio    schedule 11.03.2016
comment
Полигон с внутренними отверстиями пока не реализован. Для него есть этот запрос функции github.com/mapbox/mapbox-gl-native / issues / 1729   -  person Tobrun    schedule 12.03.2016
comment
Вот что я подумал .. спасибо   -  person Rayjax    schedule 13.03.2016
comment
Похоже, это было реализовано в апреле 2017 года.   -  person Steve Bennett    schedule 20.06.2018


Ответы (1)


После очень долгого пошагового процесса я теперь могу отображать дыры в многоугольнике из данных GeoJson.

Я использую эту версию mapbox:

compile("com.mapbox.mapboxsdk:mapbox-android-sdk:5.0.1@aar")

Я использую систему слоев Mapbox (FillLayer) в сочетании с GeoJsonSource. Вот несколько строк кода, которые помогут:

//first create a feature
Feature polygon = Feature.fromJson("{\"type\":\"Feature\",\"properties\":{\"name\":\"Home Zone\"},\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]],[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],[[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]]}}");

//Then create a Feature Collection from it
FeatureCollection collection = FeatureCollection.fromFeatures(new Feature[]{polygon});

//Finally you  just need to use the collection to update your layer Source.
GeoJsonSource geoJsonSource = map.getSourceAs("yourSourceId");
geoJsonSource.setGeoJson(collection);

В качестве образца вы можете проверить GeoJson здесь: http://geojson.io/

Формат GeoJson: https://geojson.org/geojson-spec.html#id4

GeoJson в виде обычного текста (огромный квадрат с дырой в Маласии): {"type": "Feature", "properties": {"name": "Home Zone"}, "geometry": {"type": "Polygon" , «координаты»: [[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]], [[100.0, 0.0], [101.0, 0.0] , [101,0, 1,0], [100,0, 1,0], [100,0, 0,0]], [[100,2, 0,2], [100,8, 0,2], [100,8, 0,8], [100,2, 0,8], [100,2, 0,2] ]]}}

person Tobliug    schedule 30.05.2017