天天看点

tiff遥感图像空间坐标转换(工作太忙,仅仅作为记录)

1 import rasterio
 2 from pyproj import Proj, transform, CRS
 3 
 4 ### geotiff_file: the original remote sensing file contain latitude and longitude information
 5 def coord_init(geotiff_file):
 6     with rasterio.open(geotiff_file) as r:
 7         # T0 = r.transform  # upper-left pixel corner affine transform
 8         up_left_east, up_left_north = r.transform * (0, 0)
 9 
10         bottom_right_east, bottom_right_north = r.transform * (r.width, r.height)
11         print('(up_left_east, up_left_north)', (up_left_east, up_left_north))
12         print('(bottom_right_east, bottom_right_north)', (bottom_right_east, bottom_right_north))
13 
14         res = r.res# 分辨率
15 
16         p0 = Proj(r.crs)
17         p1 = Proj(CRS.from_epsg(4326))
18         p2 = Proj(CRS.from_epsg(3857))
19 
20         up_left_lat, up_left_lon = transform(p0, p1, up_left_east, up_left_north)# p0 --> p1
21         # x_east, y_north = transform(p1, p0, up_left_lat, up_left_lon)# p1 --> p0
22         # bottom_right_lat, bottom_right_lon = transform(p0, p1, bottom_right_east, bottom_right_north)  # p0 --> p1
23         # x_east, y_north = transform(p1, p2, 39.258, 120.445)# p1 --> p2
24         # y_lat, x_lon = transform(p2, p1, x_east, y_north)  # p2 --> p1
25         # x_botm_east, y_botm_north = transform(p1, p0, bottom_right_lat, bottom_right_lon)  # p1 --> p0
26 
27     return p0, p1, p2, (up_left_lon, up_left_lat), res
28 
29 # input: points: [0]-> latitude/y, [1]-> longitude/x
30 # output: latitudes, longitudes
31 def coord_trans_array(p0, p1, p2, points, up_left_lonlat, res):
32     up_left_lon, up_left_lat = up_left_lonlat[0], up_left_lonlat[1]
33     X, Y = transform(p1, p2, up_left_lat, up_left_lon)# p1 --> p2
34 
35     pix_x, pix_y = res[0], res[1]
36     eastings = []# x, longitude
37     northings = []# y, latitude
38     for p in points:
39         p_x = X + p[1] * abs(pix_x)
40         p_y = Y - p[0] * abs(pix_y)
41         eastings.append(p_x)
42         northings.append(p_y)
43     lats, longs = transform(p2, p1, eastings, northings)# p2 --> p1
44     x_east, y_north = transform(p1, p0, lats, longs)  # p1 --> p0
45     points_new = list(zip(lats, longs))
46     return points_new
47 
48 # input: point: [0]-> latitude/y, [1]-> longitude/x
49 # output: latitudes, longitudes
50 def coord_trans_point(p0, p1, p2, point, up_left_lonlat, res):
51     # point[0] -->north, point[1] -->east
52     # p0: input primitive EPSG
53     # p1: EPSG:4326
54     # p2: EPSG:3857
55     up_left_lon, up_left_lat = up_left_lonlat[0], up_left_lonlat[1]
56     X, Y = transform(p1, p2, up_left_lat, up_left_lon)# p1 --> p2
57     pix_x, pix_y = res[0], res[1]
58     X += point[1]*abs(pix_x)
59     Y -= point[0]*abs(pix_y)
60 
61     lats, longs = transform(p2, p1, X, Y)# p2 --> p1
62     x_east, y_north = transform(p1, p0, lats, longs)  # p1 --> p0
63     return [lats, longs]
64 
65 if __name__ == '__main__':
66     geotiff_file = '/home/jiangshan/Projects/data/tif_input/10378780_15.tiff'
67     p0, p1, p2, up_left_lonlat, res = coord_init(geotiff_file)
68     points = [(0, 0), (0, 750), (0, 1500)]# y, x
69     pts = coord_trans_array(p0, p1, p2, points, up_left_lonlat, res)
70     print(pts)
71     pts = coord_trans_point(p0, p1, p2, (0, 750), up_left_lonlat, res)
72     print(pts)      

个人学习记录