Matplotlib等高线图的GeoJSON输出?

3
我正在使用Python的Matplotlib库来生成温度数据的二维数组的等高线图(存储在NetCDF文件中),我想将等高线多边形和/或线条导出为GeoJSON格式,以便在Matplotlib之外使用它们。我已经发现“pyplot.contourf”函数返回一个“QuadContourSet”对象,该对象具有一个“collections”属性,其中包含等高线的坐标。
contourSet = plt.contourf(data, levels)
collections = contourSet.collections

请问是否有人知道matplotlib是否有一种方法可以将“collections”中的坐标导出到各种格式,尤其是geojson?我已经搜索了matplotlib文档和网页,但没有找到明显的方法。

谢谢!


我认为你需要自己编写导出器 :/ (如果你这样做了,一定要与MPL社区分享) - Paul H
2个回答

4

geojsoncontour 是一个Python模块,可以将matplotlib轮廓线转换为geojson。

它使用以下简化但完整的方法将matplotlib轮廓转换为geojson:

import numpy
from matplotlib.colors import rgb2hex
import matplotlib.pyplot as plt
from geojson import Feature, LineString, FeatureCollection

grid_size = 1.0
latrange = numpy.arange(-90.0, 90.0, grid_size)
lonrange = numpy.arange(-180.0, 180.0, grid_size)
X, Y = numpy.meshgrid(lonrange, latrange)
Z = numpy.sqrt(X * X + Y * Y)

figure = plt.figure()
ax = figure.add_subplot(111)
contour = ax.contour(lonrange, latrange, Z, levels=numpy.linspace(start=0, stop=100, num=10), cmap=plt.cm.jet)

line_features = []
for collection in contour.collections:
    paths = collection.get_paths()
    color = collection.get_edgecolor()
    for path in paths:
        v = path.vertices
        coordinates = []
        for i in range(len(v)):
            lat = v[i][0]
            lon = v[i][1]
            coordinates.append((lat, lon))
        line = LineString(coordinates)
        properties = {
            "stroke-width": 3,
            "stroke": rgb2hex(color[0]),
        }
        line_features.append(Feature(geometry=line, properties=properties))

feature_collection = FeatureCollection(line_features)
geojson_dump = geojson.dumps(feature_collection, sort_keys=True)
with open('out.geojson', 'w') as fileout:
    fileout.write(geojson_dump)

虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。- 来自审查 - egor.zhdan
@egor.zhdan,我改进了我的答案,并提供了一个完整的、可工作的代码示例,展示如何将matplotlib等高线转换为geojson。 - Bart Römgens
@egor.zhdan,您能否请审查一下我的改进答案?它和我的原始答案非常不同,但仍有您的删除建议。 - Bart Römgens
我不确定你的帖子是否当前在队列中,我会检查一下。 (我不是那个投票者) - egor.zhdan

2
确保导出所有轮廓的好方法是在迭代Collection对象时使用get_paths方法,然后使用Pathto_polygons方法获取numpy数组:http://matplotlib.org/api/path_api.html?highlight=to_polygons#matplotlib.path.Path.to_polygons。但最终格式由您决定。
import matplotlib.pyplot as plt
cs = plt.contourf(data, levels)
for collection in cs.collections:
    for path in collection.get_paths():
        for polygon in path.to_polygons(): 
            print polygon.__class__
            print polygon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接