如何在iOS应用程序的Mapbox中将GeoJSON词典显示为热图

时间:2019-04-03 05:41:26

标签: ios swift mapbox

我迅速拥有一个iOS应用,该应用已使用Mapbox iOS库成功显示地图。

我还有一些GeoJSON数据,作为字典,是我从Redis数据库中提取的。拉出数据后,我已经在Xcode控制台中成功打印了该数据,看起来像这样:

Optional(["city": chicago, "data": {
    features =     (
                {
            geometry =             {
                coordinates =                 (
                    "-87.86810699999999",
                    "41.966483"
                );
                type = Point;
            };
            properties =             {
                weight = 1;
            };
            type = Feature;
        },
                {
            geometry =             {
                coordinates =                 (
                    "-87.866905",
                    "41.96288"
                );
                type = Point;
            };
            properties =             {
                weight = 3;
            };
            type = Feature;
        },
/*and so on with many more point features...*/

将Redis查询返回的原始数组转换为上述代码中的字典的行如下:

let geojson_dict = (message[0] as! String).convertToDictionary()

我现在想将此GeoJson数据放在代码中定义的MapBox地图视图上:

var mapBoxView: MGLMapView?

在我拥有GeoJson数据的时刻,mapBoxView被添加为视图并且可见。

此示例涉及如何执行此操作:

https://docs.mapbox.com/ios/maps/examples/heatmap-example/

但是GeoJson数据具有不同的结构,它不处理内存中的字典,而是从URL中提取GeoJson。再加上该示例没有得到很好的文档记录/注释,使它很难适应我的特定用例。

我尝试了以下操作:

let feature = try! MGLShape(data: geojson_dict as Data, encoding: String.Encoding.utf8.rawValue) as! MGLShapeCollectionFeature

,但这似乎不希望将geojson_dict用作字典,也不会在mapbox视图中添加热图。

1 个答案:

答案 0 :(得分:0)

您的geojson_dict [“ data”]是您的GeoJson词典。我想您已经实例化了mapboxView并将其添加到viewController中(非常类似于MapBox's Heatmap sample),所以这是如何实例化MGLShapeSource的方法。

func mapView(_ mapView: MGLMapView, didFinishLoading style: MGLStyle) {

  guard let dict = geojson_dict else {
      return
  }

  var source : MGLShapeSource

  do {
    let json = try JSONSerialization.data(withJSONObject: dict[“data"], options: JSONSerialization.WritingOptions())
    let shape = try MGLShape(data: json, encoding: String.Encoding.utf8.rawValue)
    source = MGLShapeSource(identifier: dict[“city”], shape: shape, options: nil)
    mapView.style.addSource(source)

  } catch {

    // handle any exceptions here

  }

  // Continue defining your heat layer as on Mapbox sample
  …

}