简体   繁体   中英

Plotting data on map in Mercator projector looks flipped 90 deg latitude

I am using Arch Linux with cartopy version 0.17.0 installed on the system through packagemanager. I am trying to plot a simple satellite image from hdf5 file with cartopy as plotting tool. Following is the sample code I am trying to do to produce image:-

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import h5py
import numpy as np
import cartopy
import matplotlib.pyplot as plt
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER

input_file = "../input/satellite/3RIMG_27MAR2020_0545_L1C_ASIA_MER.h5"

fh=h5py.File(input_file, 'r')
X = fh["X"][()]
Y = fh["Y"][()]
IMG_TIR1 = fh["IMG_TIR1"][()][0, :, :]

lower_latitude, left_longitude = fh['Projection_Information'].attrs["lower_left_lat_lon(degrees)"]
upper_latitude, right_longitude = fh['Projection_Information'].attrs["upper_right_lat_lon(degrees)"]
lons_values = np.linspace(left_longitude, right_longitude, X.shape[0])
lats_values = np.linspace(lower_latitude, upper_latitude, Y.shape[0])
print(lons_values)
print(lats_values)
lons, lats = np.meshgrid(lons_values, lats_values)

fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(projection=cartopy.crs.Mercator()))

ax.pcolormesh(lons, lats, IMG_TIR1, cmap=plt.cm.gist_gray, transform=cartopy.crs.Mercator())
ax.coastlines('50m', linewidth=0.8, color='black')
gl = ax.gridlines(draw_labels=True)
gl.xformatter = LONGITUDE_FORMATTER
plt.title('IMG_TIR1')

# plt.savefig('INSAT3D_IMG_TIR1_cartopy.png', bbox_inches='tight', dpi=100)

plt.show()

The resulting plot loos like this:-

在此处输入图片说明

There are two issue with the above image. Firstly, the data plotted are flipped 90 deg upside down ie India along with data looks upside down. Secondly, the latitude and longitude ticks which plotted 0.00* range where as the actual data available in lons ( [ 44.5 ... 110.] ) and lats ( [-10. ... 45.5] ) arrays are different.

Can some some one help me why the data is flipped and appreciate the help to make it perfect.

Update 1 Solved the flip data issue with reversing the lats while plotting using follwing command:-

IMG_TIR1 = fh["IMG_TIR1"][()][0, ::-1, :]

After this the image looks like this:-

在此处输入图片说明

But the second issue regarding the lats and lons ticks not plotting the actual values remain same.

If your data coordinates are lats/lons then you must used the PlateCarree transform instead of Mercator .

fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(projection=cartopy.crs.Mercator()))

# Change the transform keyword here
ax.pcolormesh(lons, lats, IMG_TIR1, cmap=plt.cm.gist_gray, transform=cartopy.crs.PlateCarree())

See this page in the cartop documentation to understand this better: https://scitools.org.uk/cartopy/docs/latest/tutorials/understanding_transform.html

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM