Python绘制地理图--Cartopy基础
生活随笔
收集整理的這篇文章主要介紹了
Python绘制地理图--Cartopy基础
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
常用地圖底圖的繪制一般由Basemap或者cartopy模塊完成,由于Basemap庫是基于python2開發的一個模塊,目前已經不開發維護。故簡單介紹cartopy模塊的一些基礎操作。
將地球三維球體投影到二維面上,減少失真。主要方式有默認投影(PlateCarree)、蘭勃脫投影(Lambert)、墨卡托投影(Mercator)、極投影。
例一:
import cartopy.crs as ccrs import matplotlib.pyplot as plt#plt.axes是創建一個軸(或者說是主體) projection參數可以理解為將三維的地理信息如何投影為二維的地理信息,這個時候參數的值就是投影方式,此時是常用的平面投影 ax = plt.axes(projection=ccrs.PlateCarree()) ax.coastlines() #這個函數是在主體上添加了海岸線# Save the plot by calling plt.savefig() BEFORE plt.show() plt.savefig('coastlines.pdf') plt.savefig('coastlines.png')plt.show() #將圖像顯示出來以上代碼是第一個例子,例子的運行結果如下
例二:
import cartopy.crs as ccrs import matplotlib.pyplot as pltax = plt.axes(projection=ccrs.Mollweide()) #這里和上一個例子更換了投影方式,投影成了橢圓形 ax.stock_img() #這個方法可以認為是添加了貼紙,讓海洋呈現藍色,將陸地和海洋分開 plt.show()?以上代碼的運行結果如下:
?例三:
import cartopy.crs as ccrs import matplotlib.pyplot as pltax = plt.axes(projection=ccrs.PlateCarree()) ax.stock_img()ny_lon, ny_lat = -75, 43 #這里是倫敦的經緯度 delhi_lon, delhi_lat = 77.23, 28.61 #這里是紐約的經緯度 #接下來是要在這兩個點上畫線加注釋文字plt.plot([ny_lon, delhi_lon], [ny_lat, delhi_lat],color='blue', linewidth=2, marker='o',transform=ccrs.Geodetic(),) #前面兩個參數是線的起始點的經緯度,最后一個參數是用來指定數據的坐標系, 一般來說,數據的坐標系與這個整體軸的坐標系是相同的,我們也可以設置為不同,此時整體是平面坐標系,數據設置為了橢圓坐標系,就是在橢圓中這兩個點畫個直線應該是什么樣的plt.plot([ny_lon, delhi_lon], [ny_lat, delhi_lat],color='gray', linestyle='--',transform=ccrs.PlateCarree(),)plt.text(ny_lon - 3, ny_lat - 12, 'New York',horizontalalignment='right',transform=ccrs.Geodetic())plt.text(delhi_lon + 3, delhi_lat - 12, 'Delhi',horizontalalignment='left',transform=ccrs.Geodetic())plt.show()以上代碼的結果如下所示:
通過這三個小例子我們了解到了一些皮毛,接著往下走。
在這個例子中我們學習1.如何繪制坐標系 2.如何顯示區域地圖
import numpy as np import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatterax=plt.axes(projection=ccrs.PlateCarree(central_longitude=0)) #這里設置了中心經線參數,就是說我們這個圖的中心線在哪 ax.stock_img() ax.coastlines()#設置坐標軸標簽 ax.set_xticks(np.arange(0,361,40), crs=ccrs.PlateCarree()) #設置緯度范圍及其間隔,以及投影方式 ax.set_yticks(np.arange(-90,90+30,30), crs=ccrs.PlateCarree()) #zero_direction_label用來設置經度的0度加不加E和W lon_formatter = LongitudeFormatter(zero_direction_label=False) lat_formatter = LatitudeFormatter() ax.xaxis.set_major_formatter(lon_formatter) ax.yaxis.set_major_formatter(lat_formatter) #設置坐標軸標簽的格式,加上N,S,E,W ax.grid() #添加網格線#設置坐標軸的粗細 ax.outline_patch.set_visible(False) ax.spines['bottom'].set_visible(True) ax.spines['left'].set_visible(True) ax.spines['right'].set_visible(True) ax.spines['top'].set_visible(True) #設置四個邊框可不可視 ax.spines['bottom'].set_linewidth(2.5);###設置底部坐標軸的粗細 ax.spines['left'].set_linewidth(2.5);####設置左邊坐標軸的粗細 ax.spines['right'].set_linewidth(2.5);###設置右邊坐標軸的粗細 ax.spines['top'].set_linewidth(2.5);####設置上部坐標軸的粗細#之前都是繪制的默認的全球地圖,此時繪制區域地圖 ax.set_extent([40,180,0,90],crs=ccrs.PlateCarree()) #第一個參數是繪制區域,起始經度,起始緯度 第二個參數是投影類型 plt.show()接下來這個例子告訴我們在圖的基礎上添加一些新的元素(湖泊等)
import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeatureproj = ccrs.PlateCarree() fig = plt.figure(figsize=(15, 7)) ax = fig.subplots(1, 1, subplot_kw={'projection': proj}) #可以看見此處設置主題軸的方式跟之前有所不同,此時是用ccrs和plt混合的方式來定義的,先用plt來設置整體大小,再來設置主軸 ax.coastlines()#在原來圖的基礎上加上一些標簽 ax.add_feature(cfeature.LAND) # 添加陸地 ax.add_feature(cfeature.COASTLINE,lw=0.3)# 添加海岸線 ax.add_feature(cfeature.RIVERS,lw=0.25)# 添加河流 ax.add_feature(cfeature.LAKES)# 添加湖泊 ax.add_feature(cfeature.BORDERS, linestyle='-',lw=0.25)# 不推薦,我國丟失了藏南、臺灣等領土 ax.add_feature(cfeature.OCEAN)#添加海洋 #ax.add_feature(cfeature.OCEAN,color='green')#添加海洋,我們還可以設置一些參數改變默認設置,主要修改lw、linestyle、color這三個參數#設置經緯度 gl = ax.gridlines(draw_labels=True, linewidth=0.2, color='k', alpha=0.5, linestyle='--') # 調節字體大小 gl.xlabel_style={'size':12.5} gl.ylabel_style={'size':12.5}#設置高精度 會出現地圖上本來沒有的一些小島 ax.add_feature(cfeature.COASTLINE.with_scale('10m'),lw=0.5)繪制中國地圖:
重點是從文件中讀取CN-border-La.da文件,目的是讀取里面每個點的經緯度,用于給底圖加上行政邊界。代碼如下:
import numpy as np import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature#讀取CN-border-La.dat文件 with open('D:/繪制地圖/CN-border-La.dat') as src:context = src.read()blocks = [cnt for cnt in context.split('>') if len(cnt) > 0]borders = [np.fromstring(block, dtype=float, sep=' ') for block in blocks] #設置畫圖各種參數 fig = plt.figure(figsize=[8, 8]) # 設置投影類型和經緯度 ax = plt.axes(projection=ccrs.LambertConformal(central_latitude=90,central_longitude=105)) # 畫海,陸地,河流,湖泊 ax.add_feature(cfeature.OCEAN.with_scale('50m')) ax.add_feature(cfeature.LAND.with_scale('50m')) ax.add_feature(cfeature.RIVERS.with_scale('50m')) ax.add_feature(cfeature.LAKES.with_scale('50m')) # 畫國界 for line in borders:ax.plot(line[0::2], line[1::2], '-', color='gray',transform=ccrs.Geodetic()) # 畫經緯度網格 ax.gridlines(linestyle='--') # 框出區域 ax.set_extent([80, 140, 13, 55]) # 畫南海,這一步是新建一個ax,設置投影 sub_ax = fig.add_axes([0.741, 0.11, 0.14, 0.155],projection=ccrs.LambertConformal(central_latitude=90,central_longitude=115)) # 畫海,陸地,河流,湖泊 sub_ax.add_feature(cfeature.OCEAN.with_scale('50m')) sub_ax.add_feature(cfeature.LAND.with_scale('50m')) sub_ax.add_feature(cfeature.RIVERS.with_scale('50m')) sub_ax.add_feature(cfeature.LAKES.with_scale('50m')) # 畫邊界 for line in borders:sub_ax.plot(line[0::2], line[1::2], '-', color='gray',transform=ccrs.Geodetic()) # 框區域 sub_ax.set_extent([105, 125, 0, 25]) # 顯示 plt.show()效果圖如下:
?
總結
以上是生活随笔為你收集整理的Python绘制地理图--Cartopy基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国智能互动纺织品市场趋势报告、技术动态
- 下一篇: 熊猫烧香简介