Mapbox Android - 如何绘制带孔的 GeoJSON 多边形

Mapbox Android - How to draw GeoJSON polygon with holes

我需要在 Mapbox Android SDK 地图.

上绘制一个带孔的 GeoJSON 多边形

正如 GeoJSON spec 所说,

For type "Polygon", the "coordinates" member must be an array of LinearRing coordinate arrays. For Polygons with multiple rings, the first must be the exterior ring and any others must be interior rings or holes.

在 Leaflet、Mapbox JS 和 Mapbox GL JS 中,加载 GeoJSON 由库本身处理。正如在 this fiddle 中所见,该库考虑了内环,因此可以正确绘制孔。

      [ //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 :Polygon drawing in Mapbox Android.

我一直在尝试 通过从外环添加所有点,然后是内环 ,一个接一个地添加一个多选项。使用来自 JSFiddle 的简单 geoJSON 它可以工作,它会造成一个漏洞。但是使用我更复杂的 geoJSON,整个渲染都被破坏了(形状看起来不像它应该的样子)。

之后,我尝试为 geoJSON 的每个环构建一个单独的多边形。当然形状很好,但是没有孔,而是堆叠的多边形而不是它们。

我一直在寻找 PolygonOptions constructor but nothing else than points can be sent. I thought about drawing all the polys and then substracting shapes but I found no such feature 的其他选择。

Here is my GeoJSON。它在 mapbox JS 上绘制得很好。我想知道我的 GeoJSON 是否有问题,但我不这么认为,因为它在 geojson.io 上绘制得很好。也许我遗漏了一些关于 geoJSON 或 mapbox 的信息。我没有找到任何关于那个的文件。我正在考虑切换到 google 地图,但这意味着要从头开始重新启动整个项目。

有什么想法吗?

经过很长的一步一步的过程,我现在能够显示来自 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","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]]]}}