关于Google Maps:Mapbox Android-如何绘制带孔的GeoJSON多边形

Mapbox Android - How to draw GeoJSON polygon with holes

我需要在Mapbox Android SDK地图上绘制带孔的GeoJSON多边形。

正如GeoJSON规范所述,

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由库本身处理。从这个小提琴中可以看出,琴键将内圈考虑在内,从而正确地画出了孔。

1
2
3
4
5
6
      [ //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。使用来自JSFiddle的简单geoJSON,它可以解决问题。但是,使用我更复杂的geoJSON时,整个渲染都被破坏了(形状看起来不应该如此)。

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

我一直在寻找PolygonOptions构造函数的其他选项,但只能发送点数。我考虑过绘制所有多边形,然后减去形状,但没有找到这样的功能。

这是我的GeoJSON。它可以在mapbox JS上很好地绘制。我想知道我的GeoJSON是否出了问题,但我不认为是对的,因为它在geojson.io上很好用。也许我缺少有关geoJSON或mapbox的东西。我没有找到任何有关的文档。我正在考虑切换到Google地图,但这意味着从头开始重新启动整个项目。

任何的想法 ?


经过漫长的逐步操作,现在我可以根据GeoJson数据显示多边形中的孔。

我正在使用此版本的mapbox:

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

我将Mapbox的图层系统(FillLayer)与GeoJsonSource结合使用。 以下几行代码可以提供帮助:

1
2
3
4
5
6
7
8
9
//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(在Malasya中带有孔的巨大正方形):
{"类型":"功能","属性":{"名称":"本地区域"},"几何形状":{"类型":"多边形","坐标":[[[[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]]]}}