良い質問。これはおそらく何度も出てくるものなので、実際にあなたの特定の質問に答える前に、このステップバイステップを見ていきます。今後の参考のために、次の例はcartopyv0.5で作成されました。
まず、デフォルトの「緯度経度」(またはより技術的にはPlateCarree)投影は、-180〜180の前方範囲で機能することに注意することが重要です。これは、標準のPlateCarree投影をこれを超えてプロットできないことを意味します。これにはいくつかの理由がありますが、そのほとんどは、ベクトルとラスターの両方を投影するときにカートピーがより多くの作業を行う必要があるという事実に要約されます(たとえば、単純な海岸線)。残念ながら、作成しようとしているプロットには、まさにこの機能が必要です。この制限を写真に入れるために、デフォルトのPlateCarreeプロジェクションは次のようになります。
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
proj = ccrs.PlateCarree(central_longitude=0)
ax1 = plt.axes(projection=proj)
ax1.stock_img()
plt.title('Global')
plt.show()
このマップに描画できる単一の長方形は、合法的に拡大された領域にすることができます(ここには少し高度なコードがありますが、画像は1000語の価値があります)。
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import shapely.geometry as sgeom
box = sgeom.box(minx=-90, maxx=45, miny=15, maxy=70)
x0, y0, x1, y1 = box.bounds
proj = ccrs.PlateCarree(central_longitude=0)
ax1 = plt.subplot(211, projection=proj)
ax1.stock_img()
ax1.add_geometries([box], proj, facecolor='coral',
edgecolor='black', alpha=0.5)
plt.title('Global')
ax2 = plt.subplot(212, projection=proj)
ax2.stock_img()
ax2.set_extent([x0, x1, y0, y1], proj)
plt.title('Zoomed in area')
plt.show()
残念ながら、必要なプロットには、この投影法で2つの長方形が必要になります。
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import shapely.geometry as sgeom
box = sgeom.box(minx=120, maxx=260, miny=15, maxy=80)
proj = ccrs.PlateCarree(central_longitude=0)
ax1 = plt.axes(projection=proj)
ax1.stock_img()
ax1.add_geometries([box], proj, facecolor='coral',
edgecolor='black', alpha=0.5)
plt.title('Target area')
plt.show()
したがって、標準のPlateCarree定義を使用して、日付線と交差するマップを描画することはできません。代わりに、PlateCarree定義の中心経度を変更して、ターゲットとする領域の単一のボックスを描画できるようにすることができます。
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import shapely.geometry as sgeom
box = sgeom.box(minx=120, maxx=260, miny=15, maxy=80)
x0, y0, x1, y1 = box.bounds
proj = ccrs.PlateCarree(central_longitude=180)
box_proj = ccrs.PlateCarree(central_longitude=0)
ax1 = plt.subplot(211, projection=proj)
ax1.stock_img()
ax1.add_geometries([box], box_proj, facecolor='coral',
edgecolor='black', alpha=0.5)
plt.title('Global')
ax2 = plt.subplot(212, projection=proj)
ax2.stock_img()
ax2.set_extent([x0, x1, y0, y1], box_proj)
plt.title('Zoomed in area')
plt.show()
うまくいけば、それはあなたがあなたの目標マップを達成するためにあなたがしなければならないことをあなたに示すでしょう、上のコードはあなたの目標を達成するために少し複雑かもしれません、それで少し単純化するために、あなたが望むプロットを生成するために私が書くコードは次のようになります:
import cartopy.feature
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
ax = plt.axes(projection=ccrs.PlateCarree(central_longitude=180))
ax.set_extent([120, 260, 15, 80], crs=ccrs.PlateCarree())
# add some features to make the map a little more polished
ax.add_feature(cartopy.feature.LAND)
ax.add_feature(cartopy.feature.OCEAN)
ax.coastlines('50m')
plt.show()
これは長い答えでした。うまくいけば、私は質問に答えただけでなく、マップ作成とカートピーのより複雑な詳細のいくつかをより明確にして、将来の問題をスムーズにするのに役立てることができます。
乾杯、