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