Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将形状文件转换为二维网格作为稀疏矩阵_Python_Numpy_Geospatial_Sparse Matrix_Shapefile - Fatal编程技术网

Python 将形状文件转换为二维网格作为稀疏矩阵

Python 将形状文件转换为二维网格作为稀疏矩阵,python,numpy,geospatial,sparse-matrix,shapefile,Python,Numpy,Geospatial,Sparse Matrix,Shapefile,我真的迷恋上了所有使用NumPy进行地理空间计算的栓接库 获取形状文件(其范围是整个地球)并从中构造稀疏矩阵(表示具有指定分辨率的经纬度栅格)的最直接方法是什么,矩阵条目1位于形状文件多边形内的所有栅格点,0位于其他位置 我知道如何用GEOPANDA或菲奥娜在HealfFELE中阅读;我陷入困境的是“转换为稀疏矩阵”部分。“光栅化”似乎还需要另一个插销,不能让我控制网格分辨率,也不能吐出除TIFF之外的任何东西,因为TIFF不太有用。这里有一种方法: 创建空稀疏矩阵 编写一个函数,将一个随机点发

我真的迷恋上了所有使用NumPy进行地理空间计算的栓接库

获取形状文件(其范围是整个地球)并从中构造稀疏矩阵(表示具有指定分辨率的经纬度栅格)的最直接方法是什么,矩阵条目1位于形状文件多边形内的所有栅格点,0位于其他位置

我知道如何用GEOPANDA或菲奥娜在HealfFELE中阅读;我陷入困境的是“转换为稀疏矩阵”部分。“光栅化”似乎还需要另一个插销,不能让我控制网格分辨率,也不能吐出除TIFF之外的任何东西,因为TIFF不太有用。

这里有一种方法:

  • 创建空稀疏矩阵
  • 编写一个函数,将一个随机点发送到一个“小”点集
  • 对于每个多边形,统一采样边界框中的所有点。对于多边形中的每个点,应用上述函数获取标准的
    ,并使用键和值1更新稀疏矩阵
  • 我不确定它是否属于直截了当的类别,但它可以在python中使用
    osgeo
    scipy
    完成。当然,如果有较大的多边形,采样速度会非常慢,但由于使用的是稀疏矩阵,我认为这不会成为问题。您还可以调整分辨率并在osgeo中使用投影

    from itertools import product
    from scipy.sparse import dok_matrix
    import numpy as np
    
    # https://pcjericks.github.io/py-gdalogr-cookbook
    from osgeo import ogr
    
    # DATA:
    # http://www.naturalearthdata.com/downloads/110m-cultural-vectors/
    
    SHP_FNAME = 'ne_110m_admin_0_countries.shp'
    
    driver = ogr.GetDriverByName('ESRI Shapefile')
    data = driver.Open(SHP_FNAME, 0)
    layer = data.GetLayer()
    
    XDIAM = 360.0
    YDIAM = 180.0
    XRES = YRES = 10 ** 2
    dX = XDIAM / XRES
    dY = YDIAM / YRES
    
    def to_key(pt):
        x, y = pt
        x -= x % dX - XDIAM / 2
        y -= y % dY - YDIAM / 2
        return (x / dX, y / dY)
    
    def geom_to_keys(g):
        xmin, xmax, ymin, ymax = g.GetEnvelope()
        print xmax, ymax, xmin, ymin
        xs = np.linspace(xmin, xmax, (xmax - xmin) / dX)
        ys = np.linspace(ymin, ymax, (ymax - ymin) / dY)
        for x, y in product(xs, ys):
            point = ogr.Geometry(ogr.wkbPoint)
            point.AddPoint(x, y)
            if g.Contains(point):
                yield to_key((x, y))
    
    smatrix = dok_matrix((XRES + 1, YRES + 1), np.int8)
    
    one = np.int8(1)
    
    for feature in layer:
        geom = feature.GetGeometryRef()
        if geom.Area() > 1000:
            continue
            # sampling is slow for large polygons
    
        for key in geom_to_keys(geom):
            smatrix.update({
                key : one,
                })
    
    if XRES * YRES < 10 ** 6 + 1:
        from matplotlib import pyplot as plt
        plt.pcolor(smatrix.toarray().transpose())
        plt.show()
    
    来自itertools导入产品的
    
    从scipy.sparse导入dok_矩阵
    将numpy作为np导入
    # https://pcjericks.github.io/py-gdalogr-cookbook
    从osgeo导入ogr
    #数据:
    # http://www.naturalearthdata.com/downloads/110m-cultural-vectors/
    上海医药名称='ne_110m_admin_0_countries.SHP'
    driver=ogr.GetDriverByName('ESRI Shapefile'))
    数据=驱动程序打开(SHP\U FNAME,0)
    layer=data.GetLayer()
    XDIAM=360.0
    YDIAM=180.0
    XRES=YRES=10**2
    dX=XDIAM/XRES
    dY=YDIAM/YRES
    def至_键(pt):
    x、 y=pt
    x-=x%dX-XDIAM/2
    y-=y%dY-YDIAM/2
    返回(x/dX,y/dY)
    def geom_至_键(g):
    xmin,xmax,ymin,ymax=g.GetEnvelope()
    打印xmax、ymax、xmin、ymin
    xs=np.linspace(xmin,xmax,(xmax-xmin)/dX)
    ys=np.linspace(ymin,ymax,(ymax-ymin)/dY)
    对于产品中的x,y(xs,ys):
    点=ogr.Geometry(ogr.wkbPoint)
    点。添加点(x,y)
    如果g.包含(点):
    屈服于_键((x,y))
    smatrix=dok_矩阵((XRES+1,YRES+1),np.int8)
    一=np.int8(1)
    对于图层中的要素:
    geom=feature.GetGeometryRef()
    如果几何面积()大于1000:
    持续
    #对于大型多边形,采样速度较慢
    对于geom_至_键(geom)中的键:
    smatrix.update({
    关键:一,,
    })
    如果XRES*YRES<10**6+1:
    从matplotlib导入pyplot作为plt
    plt.pcolor(smatrix.toarray().transpose())
    plt.show()
    
    这是一张照片;为了加快速度,我省略了几个大国


    您需要多次这样做吗?或者您可以使用GIS只做一次,然后将光栅输出导入python/numpy吗?我只需要做一次,但我对独立GIS的经验是“它们都不起作用”,因此我更愿意选择numpy和朋友。您可以在GIS.stackexchange.com上询问