将Matplotlib等高线图输出为geojson多边形

时间:2017-01-03 17:14:47

标签: javascript python json d3.js geojson

我正在使用的数据的一些背景知识。我正在从NCEP NOMADS数据服务器(特别是00p25度GFS)绘制2米温度等高线。

我发现了geojsoncontour python3模块,它运行得非常好,但它创建了一个带有LineFeatures集合的geojson文件。我对阴影轮廓之间的区域感兴趣...所以好像我需要一组多边形才能完成这个... geojsoncontour不支持。

我已经尝试使用geojson python包从matplotlib等高线图中的顶点数据创建一个geojson文件......但事实证明这比我想象的要困难。例如。在某些区域中,数据中存在最小值......并且多个多边形在彼此之上(see attached image)。我不知道如何检查多边形中是否有多边形,这样我就可以从另一个多边形创建一个带有“洞”的多边形,这样就可以对数据进行适当的样式化。

像我说的那样,这被证明是相当复杂的。有没有人有关于如何从matplotlib轮廓数据创建多边形要素集合的任何建议?也许有一种不同的方法可以从我的数据文件创建着色,这可以直接在浏览器中完成...也许使用画布(我也无法找到很多帮助)。

谢谢!

    #Code attempting to create polygons from contour data
    #Code is only complete for the case where there are minima in the data 
    #(eg. where the contour is closed)
    def contour_to_geojson(contour, geojson_filepath, contour_levels):
        collections = contour.collections
        contour_index = 0
        assert len(contour_levels) == len(collections)
        poly_features = []
        for collection in collections:
            paths = collection.get_paths()
            for path in paths:
                vert = path.vertices
                #Check to see if the path is already closed
                #There are issues with comparing floats, so set up a cutoff
                #threshold instead of directly comparing values
                bounds_lon = abs(vert[0][0]-vert[len(vert)-1][0])
                bounds_lat = abs(vert[0][1]-vert[len(vert)-1][1])
                #print(bounds_lon)
                #0.000001 is essentially 0
                coordinates = []
                if bounds_lon < 0.00001 and bounds_lat < 0.00001:
                    compliant_vert = []
                    for v in vert:
                        lat = np.asscalar(vert[v][1])
                        lon = np.asscalar(vert[v][0])
                        compliant_vert.append((lon, lat))
                    coordinates.append(compliant_vert)
                else:
                    #Still need to write code for this section
                    #Will create polygon coords using contours on either side as bounds
                if contour_index < len(contour.collections):
                    poly = Polygon(coordinates)
                    properties = {
                    "title": "%.2f" % contour_levels[contour_index]
                    }
                    poly_features.append(Feature(geometry=poly,    properties=properties))
         contour_index += 1

    feature_collection = FeatureCollection(poly_features)
    dump = geojson.dumps(feature_collection, sort_keys=True)
    with open(geojson_filepath, 'w') as fileout:
        fileout.write(dump)

0 个答案:

没有答案