v0.0.7
This commit is contained in:
@ -1,5 +1,5 @@
|
|||||||
import cartopy.crs as ccrs
|
import cartopy.crs as ccrs
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from .model_info_2d import model_info_2d, from_wrf
|
from .model_info_2d import model_info_2d, from_wrf, from_ctl
|
||||||
|
|
||||||
__all__ = ["model_info_2d", "ccrs", "np", "from_wrf"]
|
__all__ = ["model_info_2d", "ccrs", "np", "from_wrf", "from_ctl"]
|
@ -1,5 +1,6 @@
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
import cartopy.crs as ccrs
|
import cartopy.crs as ccrs
|
||||||
|
from typing import Union
|
||||||
from .proj_info import proj_LC, proj_MERC
|
from .proj_info import proj_LC, proj_MERC
|
||||||
|
|
||||||
class model_info_2d(object):
|
class model_info_2d(object):
|
||||||
@ -15,12 +16,15 @@ class model_info_2d(object):
|
|||||||
dx : float = None,
|
dx : float = None,
|
||||||
dy : float = None,
|
dy : float = None,
|
||||||
lowerleft : list = None,
|
lowerleft : list = None,
|
||||||
|
center : list = None,
|
||||||
nt : int = None,
|
nt : int = None,
|
||||||
dt : float = None,
|
dt : float = None,
|
||||||
var_list : list = None,
|
var_list : list = None,
|
||||||
type : str = None,
|
type : str = None,
|
||||||
globe : ccrs.Globe = None,
|
globe : ccrs.Globe = None,
|
||||||
debug : int = 0,
|
debug : int = 0,
|
||||||
|
rotate_deg : Union[int, float] = 0,
|
||||||
|
rotate_poi : list = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@ -60,6 +64,9 @@ class model_info_2d(object):
|
|||||||
2023-09-07 10:42:59 Sola v0.0.4 设定了默认的地球形状, 以修正默认投影与模式的偏差, 加入globe参数
|
2023-09-07 10:42:59 Sola v0.0.4 设定了默认的地球形状, 以修正默认投影与模式的偏差, 加入globe参数
|
||||||
感谢韩雨阳的帮助, 指出了两个差异的问题所在
|
感谢韩雨阳的帮助, 指出了两个差异的问题所在
|
||||||
2024-07-22 20:36:52 Sola v0.0.5 增加了判断坐标(坐标数组)是否在模式网格内的功能
|
2024-07-22 20:36:52 Sola v0.0.5 增加了判断坐标(坐标数组)是否在模式网格内的功能
|
||||||
|
2024-12-18 10:11:55 Sola v0.0.6 增加了与墨卡托投影相关的计算内容
|
||||||
|
2025-04-06 16:39:26 Sola v0.0.7 增加提供网格中心坐标计算网格的功能(优先级低于左下角坐标)
|
||||||
|
2025-04-06 16:45:22 Sola v0.0.8 增加坐标旋转功能
|
||||||
测试记录:
|
测试记录:
|
||||||
2022-09-28 16:28:10 Sola v2 新的简化网格生成方法测试完成, 结果与旧版一致
|
2022-09-28 16:28:10 Sola v2 新的简化网格生成方法测试完成, 结果与旧版一致
|
||||||
2022-09-28 18:27:59 Sola v2 测试了使用proj_LC投影的相关方法, 网格与WRF一致
|
2022-09-28 18:27:59 Sola v2 测试了使用proj_LC投影的相关方法, 网格与WRF一致
|
||||||
@ -76,8 +83,12 @@ class model_info_2d(object):
|
|||||||
self.var_list = [] if var_list is None else var_list # 变量列表
|
self.var_list = [] if var_list is None else var_list # 变量列表
|
||||||
self.globe = ccrs.Globe(ellipse="sphere", semimajor_axis=6370000, semiminor_axis=6370000) if globe is None else globe
|
self.globe = ccrs.Globe(ellipse="sphere", semimajor_axis=6370000, semiminor_axis=6370000) if globe is None else globe
|
||||||
if lowerleft is None:
|
if lowerleft is None:
|
||||||
|
if not center is None:
|
||||||
|
center_x, center_y = self.projection.transform_point(center[0], center[1], ccrs.PlateCarree())
|
||||||
|
else:
|
||||||
|
center_x, center_y = 0, 0
|
||||||
zero_lon, zero_lat = ccrs.PlateCarree().transform_point(
|
zero_lon, zero_lat = ccrs.PlateCarree().transform_point(
|
||||||
-self.dx*(self.nx-1)/2, -self.dy*(self.ny-1)/2, self.projection)
|
center_x-self.dx*(self.nx-1)/2, center_y-self.dy*(self.ny-1)/2, self.projection)
|
||||||
self.lowerleft = [zero_lon, zero_lat]
|
self.lowerleft = [zero_lon, zero_lat]
|
||||||
else:
|
else:
|
||||||
if len(lowerleft) == 2:
|
if len(lowerleft) == 2:
|
||||||
@ -90,6 +101,11 @@ class model_info_2d(object):
|
|||||||
self.lowerleft[0], self.lowerleft[1],
|
self.lowerleft[0], self.lowerleft[1],
|
||||||
ccrs.PlateCarree()
|
ccrs.PlateCarree()
|
||||||
) # 计算投影下的坐标
|
) # 计算投影下的坐标
|
||||||
|
self.rotate = 0 if rotate_deg is None else np.deg2rad(rotate_deg)
|
||||||
|
if rotate_poi is None:
|
||||||
|
self.rotate_poi_x, self.rotate_poi_y = 0, 0
|
||||||
|
else:
|
||||||
|
self.rotate_poi_x, self.rotate_poi_y = self.projection.transform_point(*rotate_poi, ccrs.PlateCarree())
|
||||||
finally:
|
finally:
|
||||||
if debug > 0:
|
if debug > 0:
|
||||||
print(f"{self.__dict__}")
|
print(f"{self.__dict__}")
|
||||||
@ -409,7 +425,27 @@ def from_wrf(file: str) -> model_info_2d:
|
|||||||
elif nf.MAP_PROJ == 3: # Mercator proj
|
elif nf.MAP_PROJ == 3: # Mercator proj
|
||||||
proj = proj_MERC(dx=dx, dy=dy, truelat1=truelat1, lat1=lat1,
|
proj = proj_MERC(dx=dx, dy=dy, truelat1=truelat1, lat1=lat1,
|
||||||
lon1=lon1, stdlon=stdlon, nx=nx, ny=ny)
|
lon1=lon1, stdlon=stdlon, nx=nx, ny=ny)
|
||||||
|
elif nf.MAP_PROJ == 6: # lon-lat proj
|
||||||
|
proj = ccrs.PlateCarree
|
||||||
|
dx /= 111177.473
|
||||||
|
dy /= 111177.473
|
||||||
|
|
||||||
# make model_info
|
# make model_info
|
||||||
model = model_info_2d(proj=proj, nx=nx, ny=ny, dx=dx, dy=dy,
|
model = model_info_2d(proj=proj, nx=nx, ny=ny, dx=dx, dy=dy,
|
||||||
lowerleft=proj.grid_lonlat(0, 0))
|
lowerleft=proj.grid_lonlat(0, 0))
|
||||||
return model
|
return model
|
||||||
|
|
||||||
|
def from_ctl(file: str) -> model_info_2d:
|
||||||
|
with open(file, "r") as f:
|
||||||
|
lines = f.readlines()
|
||||||
|
for line in lines:
|
||||||
|
if "PDEF" in line.upper():
|
||||||
|
if "LCC" in line.upper():
|
||||||
|
_, nx, ny, _, lat1, lon1, knowi, knowj, truelat1, truelat2, stdlon, dx, dy = line.split()
|
||||||
|
nx, ny = int(nx), int(ny)
|
||||||
|
lat1, lon1, knowi, knowj, truelat1, truelat2, stdlon, dx, dy =\
|
||||||
|
float(lat1), float(lon1), float(knowi), float(knowj), float(truelat1), float(truelat2), float(stdlon), float(dx), float(dy)
|
||||||
|
proj = proj_LC(dx=dx, dy=dy, truelat1=truelat1, truelat2=truelat2, lat1=lat1, lon1=lon1,
|
||||||
|
knowni=knowi, knownj=knowj, stdlon=stdlon, nx=nx, ny=ny)
|
||||||
|
model = model_info_2d(proj=proj, nx=nx, ny=ny, dx=dx, dy=dy, lowerleft=proj.grid_lonlat(0, 0))
|
||||||
|
return model
|
||||||
|
@ -9,8 +9,8 @@ import logging
|
|||||||
2024-12-17 15:39:45 Sola v3 增加墨卡托投影
|
2024-12-17 15:39:45 Sola v3 增加墨卡托投影
|
||||||
"""
|
"""
|
||||||
|
|
||||||
logging.basicConfig(format='[%(asctime)s][%(levelname)s]: %(message)s',
|
# logging.basicConfig(format='[%(asctime)s][%(levelname)s]: %(message)s',
|
||||||
level=logging.DEBUG, datefmt='%Y-%m-%dT%H:%M:%S %Z')
|
# level=logging.DEBUG, datefmt='%Y-%m-%dT%H:%M:%S %Z')
|
||||||
EARTH_RADIUS_M = 6370000.
|
EARTH_RADIUS_M = 6370000.
|
||||||
|
|
||||||
class proj_info(object):
|
class proj_info(object):
|
||||||
|
Reference in New Issue
Block a user