[英]Plot a country's chloropleth map using lat and lon columns in python
[英]Lat, Lon, Values CSV to Raster Map Using Python
如果我具有包含Lat,Lon和Value字段的CSV數據集,那么使用python生成柵格地圖的最佳方法是什么? 柵格Z字段可以是此表中的任何列。
L5 L6 L7 L8 L9 L10 L11 L12 L13 L14 LAT LON
3.571732 1.338448 0 9.96921E+36 -3.482845 -1.42944 133.229919 141.246002 67.685631 5.059844 24.335797 -95.088764
3.571732 1.338448 0 9.96921E+36 -3.420345 -1.42944 132.749512 140.641464 67.318848 5.105563 24.335107 -95.060013
3.571732 1.338448 0 9.96921E+36 -3.420345 -1.42944 132.230164 140.047211 67.318848 5.063346 24.334408 -95.031263
3.571732 1.338448 0 9.96921E+36 -3.420345 -1.42944 132.230164 139.463104 67.318848 5.063346 24.333701 -95.002512
3.509232 1.369698 0 9.96921E+36 -3.357845 -1.42944 131.702133 137.82196 66.940475 5.021552 24.332986 -94.973763
3.509232 1.369698 0 9.96921E+36 -3.357845 -1.49194 131.702133 137.26651 66.043732 5.021552 24.332263 -94.945013
3.509232 1.369698 0 9.96921E+36 -3.357845 -1.49194 131.165268 136.72081 66.043732 4.980192 24.331531 -94.916265
3.509232 1.338448 0 9.96921E+36 -3.357845 -1.49194 131.165268 136.184738 66.043732 4.980192 24.330792 -94.887516
請記住,這些是numpy數組
根據您的緯度,經度坐標,有兩個選項。 當緯度,經度坐標形成等距網格時,可以使用第一個選項,否則可以使用下面的第二個選項。
第一選擇
我在下面的數組中創建第一列的值,在第二列和第三列的Lat,Lon值:
import numpy as np
lat = np.arange(0, 15, 5)
lon = np.arange(0, 10, 5)
val = np.random.randint(0,10, size =len(lat)*len(lon))
xx, yy = np.meshgrid(lon, lat)
array = np.array([val, yy.ravel(), xx.ravel()]).T
print(array)
>>> array([[ 7, 0, 0],
[ 8, 0, 5],
[ 7, 5, 0],
[ 3, 5, 5],
[ 2, 10, 0],
[ 8, 10, 5]])
當您的緯度,經度坐標進行整齊的排序時,您可以調整值的形狀以得到如下所示的網格數組:
no_lon = len(np.unique(array[:,-1]))
no_lat = len(np.unique(array[:,-2]))
grid_array = array[:,0].reshape((no_lat,no_lon))[::-1]
print(grid_array)
>>> array([[2, 8],
[7, 3],
[7, 8]])
第二種選擇
當您有一堆隨機緯度時,Lon會使用與在此處創建的值類似的值進行協調:
array = np.random.randint(0,10, size =(6,3))
print(array)
>>> array([[9 6 0]
[7 8 8]
[6 0 9]
[7 7 4]
[2 4 3]
[0 2 9]])
您可以使用以下插值將其轉換為網格:
from scipy import interpolate
lon_list = np.arange(3, 6, 1)
lat_list = np.arange(4, 8, 1)
lon_2d, lat_2d = np.meshgrid(lon_list, lat_list)
grid_array = interpolate.griddata((array[:,-1], array[:,-2]), array[:,0],
(lon_2d, lat_2d))[::-1]
print(grid_array)
>>> [[ nan 7. 6.72]
[ 6. 5.4 5.6 ]
[ 4. 3.8 4. ]
[ 2. 2.2 2.4 ]]
請注意,如果網格單元不在點的范圍內,則會得到nan值。
您可以使用plt.imshow可視化結果
import matplotlib.pyplot as plt
plt.imshow(grid_array)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.