当前位置: 首页 > 知识库问答 >
问题:

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

翟博雅
2023-03-14

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

正如GeoJSON规范所说,

对于类型“多边形”,“坐标”成员必须是线性环坐标数组的数组。对于有多个环的多边形,第一个必须是外环,其他必须是内环或孔。

在手册Mapbox JS和Mapbox GL JS中,加载GeoJSONs由库本身处理。从这把小提琴中可以看出,lib考虑了内环,因此正确地绘制了孔。

      [ //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文档中关于绘制多边形的内容时,没有任何关于孔的信息。他们给出的示例只是在所有点上循环,并使用它构建一个多选项:Mapbox Android中的多边形绘制。

我一直试图通过添加外环的所有点来构建一个多边形选项,然后是内环,一个接一个。通过JSFiddle的简单GeoJSON,它可以打开一个洞。但是在我更复杂的GeoJSON中,整个渲染被破坏了(形状看起来不像它应该的样子)。

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

我一直在寻找PolygoOptions构造函数的其他选项,但除了点之外,没有其他选项可以发送。我想画所有多边形,然后减去形状,但我没有发现这样的功能。

这是我的GeoJSON。它在Mapbox JS上绘制精细。我想知道我的GeoJSON是否有问题,但我不这么认为,因为它吸引了罚款geojson.io.也许我错过了一些关于GeoJSON或mapbox的东西。我没有找到任何留档。我正在考虑改用谷歌地图,但这意味着从头开始整个项目。

任何想法?

共有1个答案

邹胜泫
2023-03-14

经过很长的一步一步的过程,我现在能够从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(在马拉西亚有洞的巨大正方形):{“类型”:“特征”,“属性”:{“名称”:“家园地带”},“几何体”:{“类型”:“多边形”,“坐标”:[[[102.0,2.0],[103.0,2.0],[103.0,3.0],[102.0,3.0],[100.0,2.0],[101.0,0.0],[101.0,1.0],[100.0,0],[100.0,0],[100.0,0],[100.0,0],[100.0,0],[100.0,8],[100.0],[100.2, 0.8], [100.2, 0.2]]]}}

 类似资料:
  • 假设我有三个锚,来自阿拉片段的命中结果。 锚定=命中结果。createAnchor(); 如何使用Sceneform绘制三角形并应用自定义纹理?

  • 问题内容: 我需要知道如何在画布上绘制多边形。不使用jQuery或类似的东西。 问题答案: 使用和创建一个路径:

  • 我正在尝试使用GeoJSON在地图上绘制点。我阅读了文件,其中说明: 可以通过调用数据对象的loadGeoJSON()方法来加载和显示GeoJSON文件 (https://developers.google.com/maps/documentation/javascript/datalayer) 但是,同一页上的示例代码显示: map.data.loadGeoJson(…) 因此,我使用代码示例,

  • 我有问题从我的Geojson文件导入属性。我很新,试图尽我所能学习,但我已经被这个难倒了一段时间。 我有一个geojson,有大约50个多边形,它们都有独特的样式。我可以毫无问题地将多边形导入到传单贴图中,但是样式属性不会转移。 我尝试了各种方法来尝试导入属性并应用它们。到目前为止,这些措施都没有奏效。 下面是我最近一次尝试导入GeoJSON并为每个多边形应用正确的样式。 我的控制台中没有错误消息

  • 我能够创建一个窗口,并清除到所需的颜色。但无法在左下角绘制正方形。

  • 问题内容: 我在本教程中使用了六边形代码,并创建了一个createHex类(我应该发布代码吗?)。链接的网页已使用以下代码通过createHex中的数学运算实际绘制六边形: 我遇到的问题是Android没有包含所有必需方法的Graphics类。我在android文档上做了大约一个半小时的钓鱼,而我发现最接近的东西是Path类,但是它没有我需要的方法。我想在顶部的链接文章中使用六边形代码,但找不到等