python采用Basemap绘制完美中国地图(包括绘制边界框,随机点等)
生活随笔
收集整理的這篇文章主要介紹了
python采用Basemap绘制完美中国地图(包括绘制边界框,随机点等)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
python采用Basemap繪制完美中國地圖(包括繪制邊界框,隨機點等)
- 1. 效果圖
- 2. 原理
- 2.1 依賴模塊及安裝
- 2.2 工程目錄
- 2.3 依賴文件latlng.txt 經緯度
- 3 源碼
- 參考
這篇博客將介紹如何使用basemap繪制簡單的地圖(包括繪制邊界框,隨機點等),Basemap基于GEOS的地圖二維數據,其底圖數據庫與GMT相同,封裝了大量常用的地圖投影、坐標轉換功能,利用簡潔的Python語法支持繪出多種多樣的地理地圖。
寫這篇博客源于一個博友的提問,繪制 地圖及經緯度點 為這樣的效果圖:
1. 效果圖
左圖效果圖如下:
右圖效果圖如下:
2. 原理
2.1 依賴模塊及安裝
- 依賴模塊如下:
geos
pyproj
basemap
- 安裝
pip install geos
pip install pyproj
basemap的wheel文件可在 https://www.lfd.uci.edu/~gohlke/pythonlibs/ 下載,注意需要和python版本以及系統版本對應;
下載完成就可以安裝了:
pip install basemap-1.2.2-cp37-cp37m-win_amd64.whl
2.2 工程目錄
$ tree
.
|-- images
| `-- latlng.txt ------依賴經緯度值
|-- left.png ------------程序運行生成
|-- plot_map.py----------程序代碼
`-- right.png -----------程序運行生成1 directory, 4 files
2.3 依賴文件latlng.txt 經緯度
經緯度是從提問的圖片中OCR識別出來的寫入了文件,OCR可參考:
另外為了效果圖更加明顯,隨機增加了一些經緯度;
-125 -125.5 48.5 49.0 -125.23 48.79 2012 5 4 7
-125 -125.5 48.5 49.0 -125.1 48.9 2012 5 4 7
-125 -125.5 48.5 49.0 -125.4 48.6 2012 5 4 7
-125 -130.5 48.5 55.0 -128.23 54.79 2012 5 4 7
-125 -134.5 35.5 49.0 -134.23 36.79 2012 5 4 7
-125 -134.5 35.5 49.0 -130.23 40.79 2012 5 4 7
-125 -130.5 45.5 55.0 -128.23 52.79 2012 5 4 7
-125 -134.5 45.5 49.0 -134.23 46.79 2012 5 4 7
-125 -134.5 45.5 49.0 -130.23 51.79 2012 5 4 7
-65.5 -66.0 43 43.5 -65.93 43.33 2011 12 14 7
-61.5 -62.0 47 47.5 -61.96 47.39 2011 5 21 16
-64.5 -65.0 43.5 44.0 -64.87 43.7 2010 12 2 22
-55.5 -56.0 45.5 46.0 -55.75 45.7 2010 10 13 7
-66 -66.5 43.5 44.0 -66.41 43.98 2009 12 16 14
-53 -53.5 49 49.5 -53.35 49.23 2009 11 3 19
-53 -53.5 50 50.5 -53.47 50.29 2009 10 24 11
-51 -51.5 45.5 46.0 -51.02 45.6 2009 9 13 16
-64 -64.5 49 49.5 -64.37 49.0 2009 5 18 22
3 源碼
# 繪制地圖數據
# 注意:plt.savefig() 依賴 matplotlib.use("Agg")設置
# plt.show時,需要注釋掉 matplotlib.use("Agg")
import osimport numpy as np
from mpl_toolkits.basemap import Basemap # 地圖依賴
import matplotlib.pyplot as plt # 繪制效果圖及可視化
import matplotlib.image as mpimg # 讀取圖片
import matplotlib # 保存圖片# 設置此才可保存圖片到本地,但同時沒法可視化plt.show()了
# matplotlib.use("Agg")def left_map():# 邊界框,及起點0,0處經緯度map = Basemap(llcrnrlon=-135, llcrnrlat=45, urcrnrlon=-120, urcrnrlat=55,resolution='i', lat_0=45, lon_0=-135)map.drawmapboundary(fill_color='aqua')map.fillcontinents(color='#ddaa66', lake_color='aqua')map.drawcoastlines() # 繪制海岸線圖層# drawparalles: 繪制lon# drawmeridians:繪制lat# range(-90,100,5)等差數列,因為range到達不了本身,所以需要大一點# linewidht:線寬# dashes[4,2]: 4繪制大小,2間隔像素# labels[1,0,0,1]:文本位置 分別代表左、右、上、下# color: 字體顏色# zorder:改變線的位置,例如,能夠使土地覆蓋平行線,或相反. 0:線在土地下方(看不見),1:線在土地上方map.drawparallels(range(45, 57, 2), linewidth=2, dashes=[4, 2], labels=[1, 0, 0, 1], color='r', zorder=0)map.drawmeridians(range(-135, 118, 5), linewidth=2, dashes=[4, 2], labels=[1, 0, 0, 1], color='b', zorder=0)# 獲取第5列得到經度lons,獲取第5列得到緯度lats# my_data = np.loadtxt('images/latlng.txt')# lons = my_data[:, [4]]# lats = my_data[:, [5]]# 生成隨機點lons = np.random.randint(120, 135, (25, 1)).astype(np.float32) * -1lats = np.random.randint(45, 55, (25, 1)).astype(np.float32)x, y = map(lons, lats)# 繪制點 圓點紅色# 可參考https://matplotlib.org/stable/api/markers_api.html 找到繪制的樣式# 可參考https://matplotlib.org/stable/api/colors_api.html 找到繪制的顏色map.scatter(x, y, marker='.', color='r')plt.show()# plt.savefig('left.png')def right_map():# 邊界框,及起點0,0處經緯度map = Basemap(llcrnrlon=-75, llcrnrlat=35, urcrnrlon=-45, urcrnrlat=55,resolution='i', lat_0=35, lon_0=-75)map.drawmapboundary(fill_color='aqua')map.fillcontinents(color='#ddaa66', lake_color='aqua')map.drawcoastlines() # 繪制海岸線圖層# drawparalles: 繪制lon# drawmeridians:繪制lat# range(-90,100,5)等差數列# linewidht:線寬# dashes[4,2]: 4繪制大小,2間隔像素# labels[1,0,0,1]:文本位置 分別代表左、右、上、下# color: 字體顏色# zorder:改變線的位置,例如,能夠使土地覆蓋平行線,或相反. 0:線在土地下方(看不見),1:線在土地上方map.drawparallels(range(-90, 100, 5), linewidth=2, dashes=[4, 2], labels=[1, 0, 0, 1], color='r', zorder=0)map.drawmeridians(range(-75, 0, 10), linewidth=2, dashes=[4, 2], labels=[1, 0, 0, 1], color='b', zorder=0)my_data = np.loadtxt('images/latlng.txt')# print(my_data.shape)# print(my_data)# print('lon: ',my_data[:,[4]])# print('lat: ',my_data[:,[5]])# 獲取第5列得到經度lons,獲取第5列得到緯度latslons = my_data[:, [4]]lats = my_data[:, [5]]x, y = map(lons, lats)# 繪制點 圓點紅色# 可參考https://matplotlib.org/stable/api/markers_api.html 找到繪制的樣式# 可參考https://matplotlib.org/stable/api/colors_api.html 找到繪制的顏色map.scatter(x, y, marker='.', color='r')plt.show()# plt.savefig('right.png')left_map()
right_map()def mixshow():folder_path = os.getcwd().replace('\\', '/')list = [folder_path + '/left.png', folder_path + '/right.png']for i, j in enumerate(list):print(j)# matplot讀出來是RGBimage = mpimg.imread(j)plt.subplot(1, 2, i + 1)plt.imshow(image) # 通過for循環逐個顯示圖像plt.xticks([]) # 去掉x軸的刻度plt.yticks([]) # 去掉y軸的刻度plt.show()mixshow()
參考
- https://www.cnblogs.com/zhuwjwh/p/12325694.html
- 官網文檔
- github 源碼
總結
以上是生活随笔為你收集整理的python采用Basemap绘制完美中国地图(包括绘制边界框,随机点等)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python,OpenCV使用KNN来构
- 下一篇: Python,OpenCV中的非局部均值