7

Cartopy を使用して表示したい衛星画像データがあります。ここで説明されている画像の例にうまく従いました。このコードの結果:

import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs

fig = plt.figure(figsize=(12, 12))
img_extent = (-77, -59, 9, 26)

ax = plt.axes(projection=ccrs.PlateCarree())
# image data coming from server, code not shown
ax.imshow(img, origin='upper', extent=img_extent)
ax.set_xmargin(0.05)
ax.set_ymargin(0.10)

# mark a known place to help us geo-locate ourselves
ax.plot(-117.1625, 32.715, 'bo', markersize=7)
ax.text(-117, 33, 'San Diego')

ax.coastlines()
ax.gridlines()

plt.show() 

このコードは、次の画像を生成します間違った投影

私の問題は、衛星画像データがプレートカリー図法ではなく、メルカトル図法であることです。

しかし、軸オブジェクトを取得すると

ax = plt.axes(projection=ccrs.Mercator())

海岸線を失います。

海岸線なし

ここで報告された問題を見ました。しかし

ax.set_global()

この画像の結果:

私のデータはどこですか

データは存在せず、サンディエゴは間違った場所にあります。また、緯度/経度の範囲が変更されました。私は何を間違っていますか?

ポスト ディスカッションの更新

主な問題は、メソッドを使用してターゲット プロジェクションのイメージ範囲を適切に指定していなかったことtransform_pointsです。imshowPhil が提案するように、メソッドの座標参照系についても具体的に説明する必要がありました。正しいコードは次のとおりです。

import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs

proj = ccrs.Mercator()
fig = plt.figure(figsize=(12, 12))
extents = proj.transform_points(ccrs.Geodetic(),
                                np.array([-77, -59]),
                                np.array([9, 26]))

img_extents = (extents[0][0], extents[1][0], extents[0][6], extents[1][7] ) 

ax = plt.axes(projection=proj)
# image data coming from server, code not shown
ax.imshow(img, origin='upper', extent=img_extents,transform=proj)

ax.set_xmargin(0.05)
ax.set_ymargin(0.10)

# mark a known place to help us geo-locate ourselves
ax.plot(-117.1625, 32.715, 'bo', markersize=7, transform=ccrs.Geodetic())
ax.text(-117, 33, 'San Diego', transform=ccrs.Geodetic())

ax.coastlines()
ax.gridlines()

plt.show() 

この正しく地理投影された衛星画像が得られます。

正しい画像

4

1 に答える 1