matplotlib 等高线图 geojson 输出?

emb*_*pea 4 matplotlib contour geojson

我正在使用 python matplotlib 从温度数据的二维数组(存储在 NetCDF 文件中)生成等高线图,并且我有兴趣将等高线多边形和/或线条导出为 geojson 格式,以便我可以在 matplotlib 之外使用它们。我发现“pyplot.contourf”函数返回一个“QuadContourSet”对象,该对象具有包含轮廓坐标的“collections”属性:

contourSet = plt.contourf(data, levels)
collections = contourSet.collections
Run Code Online (Sandbox Code Playgroud)

有谁知道 matplotlib 是否有办法将“集合”中的坐标导出为各种格式,特别是 geojson?我搜索了 matplotlib 文档和网络,但没有找到任何明显的结果。

谢谢!

Bar*_*ens 5

geojsoncontour是一个将 matplotlib 等高线转换为 geojson 的 Python 模块。

它使用以下简化但完整的方法将 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)
Run Code Online (Sandbox Code Playgroud)