1

我正在尝试将 Pumps.shp 数据绘制在同一图上本网站的 OSMap.tif 文件之上。

我尝试使用 rasterio.plot() 和 geopandas.plot() 方法以及 matplotlibs 子图。

问题是绘图不匹配,光栅文件被绘制在两个轴的范围(0,1000)中,而 shp 被绘制在实际坐标范围内(x 轴和周围大约 50000)。

两个对象中的 crs 相等,并且坐标在相同的范围内。为什么是这样?我究竟做错了什么?

这是我的代码

   import rasterio as rast
   import rasterio.plot as rsplot
   import geopandas as gpd
   src=rast.open("OSMap.tif")
   data=gpd.read_file("Pumps.shp")
   fig,ax=plt.subplots()
   rsplot.show(src,ax=ax)
   data.plot(ax=ax)
   plt.show()

这是调用 src.bounds 的结果:

边界框(左=528765.0,下=180466.0,右=529934.0,上=181519.0)

这是 data.bounds 的结果

(528765.0、180466.0、529934.0、181519.0)

这是两者的crs:

CRS({'lon_0': -2, 'y_0': -100000, 'k': 0.9996012717, 'lat_0': 49, 'proj': 'tmerc', 'wktext': True, 'datum': 'OSGB36' , 'no_defs': True, 'x_0': 400000, 'units': 'm'})

4

2 回答 2

1

我有同样的问题rasterio 0.36.0。我首先尝试翻译和缩放栅格,但更喜欢翻译 shapefile。

我的代码如下所示:

import geopandas as gpd
import matplotlib.pyplot as plt
import rasterio

image = rasterio.open('input.tif') # with tgw world file
shapefile = gpd.read_file('input.shp')

# coordinates and scaling factors
scale_x = image.transform[1]
scale_y = image.transform[5]
x0 = image.transform[0]
y0 = image.transform[3]

# translates back shapefile
shapefile.geometry = shapefile.translate(-x0, -y0)
shapefile.geometry = shapefile.scale(-1.0/scale_x, -1.0/scale_y, origin=(0, 0, 0))

# plots both elements
fig, ax = plt.subplots()
ax = rasterio.plot.show(image.read(), with_bounds=True, ax=ax)
shapefile.plot(ax=ax)
于 2019-10-15T15:43:29.770 回答
0

使用 matplotlib imshow 而不是 rasterio show。将栅格的边界作为 imshow 的“范围”参数传递。

于 2020-02-19T20:19:51.630 回答