better support for coordinates conversion between cartesian and geographic

This commit is contained in:
wyq 2023-09-02 11:21:43 +08:00
parent 94983e6888
commit 278c1b6043
3 changed files with 63 additions and 21 deletions

View File

@ -1,13 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<MeteoInfo File="milconfig.xml" Type="configurefile">
<Path OpenPath="D:\Working\MIScript\Jython\mis\io\radar">
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io\savefig"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types"/>
<Path OpenPath="D:\Working\MIScript\Jython\mis\toolbox\miml">
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\no_opengl"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\surf"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\array\complex"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\volume"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\array"/>
@ -16,17 +12,23 @@
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\geoshow"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io\radar"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\toolbox"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\toolbox\miml\cluster"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\toolbox\miml"/>
</Path>
<File>
<OpenedFiles>
<OpenedFile File="D:\MyProgram\java\MeteoInfoDev\toolbox\meteoview3d\_reload.py"/>
<OpenedFile File="D:\MyProgram\java\MeteoInfoDev\toolbox\meteoview3d\mainGUI.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\io\radar\radar_cma_base_grid_3d.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\io\radar\radar_cma_base_grid_3d_geo_to_nc.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\io\radar\grid3d_to_nc.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\io\radar\test_plot_grid_3d_nc.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\toolbox\miml\cluster\dbscan_1.py"/>
</OpenedFiles>
<RecentFiles>
<RecentFile File="D:\MyProgram\java\MeteoInfoDev\toolbox\meteoview3d\_reload.py"/>
<RecentFile File="D:\MyProgram\java\MeteoInfoDev\toolbox\meteoview3d\mainGUI.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\io\radar\radar_cma_base_grid_3d.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\io\radar\radar_cma_base_grid_3d_geo_to_nc.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\io\radar\grid3d_to_nc.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\io\radar\test_plot_grid_3d_nc.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\toolbox\miml\cluster\dbscan_1.py"/>
</RecentFiles>
</File>
<Font>
@ -34,5 +36,5 @@
</Font>
<LookFeel DockWindowDecorated="true" LafDecorated="true" Name="FlatDarkLaf"/>
<Figure DoubleBuffering="true"/>
<Startup MainFormLocation="-7,0" MainFormSize="1387,825"/>
<Startup MainFormLocation="-7,-7" MainFormSize="1293,685"/>
</MeteoInfo>

View File

@ -95,9 +95,10 @@ class RadarDataFile(DimDataFile):
:return: (*array*) Grid 3d data.
"""
xg, yg = np.meshgrid(x, y)
if x.ndim == 1:
x, y = np.meshgrid(x, y)
r = self.datainfo.getGrid3DData(product, xg._array, yg._array, z._array, h)
r = self.datainfo.getGrid3DData(product, x._array, y._array, z._array, h)
return np.array(r)
def get_vcs_data(self, product, start_point, end_point):

View File

@ -3,7 +3,8 @@ import mipylib.numeric as np
from org.meteoinfo.data.meteodata.radar import Transform
__all__ = ['antenna_to_cartesian','antenna_to_geographic']
__all__ = ['antenna_to_cartesian','antenna_to_geographic','get_aeqd_projection',
'geographic_to_cartesian','cartesian_to_geographic']
def antenna_to_cartesian(distance, azimuth, elevation, h=None):
@ -57,12 +58,12 @@ def antenna_to_cartesian(distance, azimuth, elevation, h=None):
return x, y, z
def antenna_to_geographic(lon, lat, distance, azimuth, elevation, h=None):
def antenna_to_geographic(rlon, rlat, distance, azimuth, elevation, h=None):
"""
Convert antenna coordinate to geographic (longitude/latitude) coordinate.
:param lon: (*float*) Longitude of the radar.
:param lat: (*float*) Latitude of the radar.
:param rlon: (*float*) Longitude of the radar.
:param rlat: (*float*) Latitude of the radar.
:param distance: (*array*) Distances to the center of the radar gates (bins) in meters.
:param azimuth: (*array*) Azimuth angle of the radar in degrees.
:param elevation: (*array*) Elevation angle of the radar in degrees.
@ -71,7 +72,45 @@ def antenna_to_geographic(lon, lat, distance, azimuth, elevation, h=None):
:return: Geographic coordinate.
"""
x, y, z = antenna_to_cartesian(distance, azimuth, elevation, h)
proj = geolib.projinfo(proj='aeqd', lon_0=lon, lat_0=lat)
rlon, rlat = geolib.project(x, y, fromproj=proj)
lon, lat = cartesian_to_geographic(rlon, rlat, x, y)
return rlon, rlat, z
return lon, lat, z
def get_aeqd_projection(rlon, rlat):
"""
Get azimuth equidistant projection.
:param rlon: (*float*) Radar longitude.
:param rlat: (*float*) Radar latitude.
:return: Azimuth equidistant projection.
"""
return geolib.projinfo(proj='aeqd', lon_0=rlon, lat_0=rlat)
def geographic_to_cartesian(rlon, rlat, lon, lat):
"""
Convert cartesian coordinates to geographic coordinates.
:param rlon: (*float*) Radar longitude.
:param rlat: (*float*) Radar latitude.
:param lon: (*array*) Longitude coordinates in degrees.
:param lat: (*array*) Latitude coordinates in degrees.
:return: Cartesian coordinates in meters from the radar (x, y).
"""
proj = get_aeqd_projection(rlon, rlat)
return geolib.project(lon, lat, toproj=proj)
def cartesian_to_geographic(rlon, rlat, x, y):
"""
Convert geographic coordinates to cartesian coordinates.
:param rlon: (*float*) Radar longitude.
:param rlat: (*float*) Radar latitude.
:param x: (*array*) X coordinates in meters.
:param y: (*array*) Y coordinates in meters.
:return: Cartesian coordinates in meters from the radar (x, y).
"""
proj = get_aeqd_projection(rlon, rlat)
return geolib.project(x, y, fromproj=proj)