日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python绘制地理图--Cartopy基础

發布時間:2024/1/8 python 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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基础的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。