爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 19510|回复: 8

[求助] 如何用Cartopy或Basemap实现matlab中的兰伯特投影?

[复制链接]

新浪微博达人勋

发表于 2019-3-27 17:13:39 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
在MATLAB中,兰伯特投影(LCC)的地图可选择是否用矩形边框,默认使用扇形边框,如图所示:
untitled.png
但是在Cartopy或者Basemap中只能画矩形边框,我更想采用的是扇形边框,也许是我学艺未精,请大家不吝赐教。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-3-28 08:48:05 | 显示全部楼层
cartopy中选择投影方式为LambertConformal
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-4-4 13:05:35 | 显示全部楼层
尽头的尽头 发表于 2019-3-28 08:48
cartopy中选择投影方式为LambertConformal

你确定可以实现跟我的图一样的效果?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-2-28 00:11:17 | 显示全部楼层
请问楼主问题解决了吗?我使用Cartopy出了兰伯特投影的图,一是只能画出矩形图,二是兰伯特的经纬线不知怎么添加?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-3-9 14:37:54 | 显示全部楼层
basemap 中用 projection  = 'lcc',  即可,示例代码如下:
  1. plt.figure(figsize=((16, 9)))
  2. map = Basemap(llcrnrlon   = milo,  # ll 左下,ur 右上
  3.               llcrnrlat   = mila,
  4.               urcrnrlon   = malo,
  5.               urcrnrlat   = mala,
  6.               projection  = 'lcc',  
  7.               lat_0       = (mala+mila)/2,
  8.               lon_0       = (malo+milo)/2)
  9. map.drawcoastlines(color = 'grey')
  10. # shp_info = map.readshapefile("./ShapeFile/中国行政区_包含南海九段线",'states',drawbounds=True, color = 'grey')
  11. # 绘制中国省界https://blog.csdn.net/ouening/article/details/55227364
  12. nx              = prec.shape[1]; ny = prec.shape[0]
  13. Llats, Llons    = map.makegrid(nx, ny)
  14. x, y            = map(Llats, Llons)
  15. # https://www.jianshu.com/p/e36d1b4c455a
  16. # 经纬线空间均匀

  17. cmprec=('#F7F7F7', '#A5F38D', '#3DB93F', '#63B8F9', '#0000FE', '#F305EE', '#810040')
  18. cs = map.contourf(x, y, prec, np.array([2, 10, 25, 50, 100, 200]), colors=cmprec, extend='both')
  19. map.colorbar(cs, location='right', label='mm')
  20. map.drawparallels(np.arange(18, 55, 8), labels=[1,0,0,0], linewidth=0.5, fontsize=12)
  21. map.drawmeridians(np.arange(72, 137, 8), labels=[0,0,0,1], linewidth=0.5, fontsize=12)
  22. plt.title(fname[-12:-8]+'.'+fname[-8:-6]+'.'+fname[-6:-4]+' Preciption')
  23. plt.show()
  24. # plt.savefig(fname[-12:-4]+'Preciption'+'.png')
  25. plt.close('all')
  26. # return True
复制代码



[img]![](

                               
登录/注册后可看大图
)[/img]

附上 basemap 所有投影命令

  1. |First Header|Second Header|Second Header|
  2. |------------ |------------- |------------- |
  3. cyl|Cylindrical Equidistant|圆柱等距
  4. merc|Mercator| 墨卡托
  5. tmerc|Transverse Mercator|横轴墨卡托投影
  6. omerc|Oblique Mercator| 倾斜麦克托投影
  7. mill|Miller Cylindrical| 米勒图柱投影
  8. gall|Gall Stereographic Cylindrical| Gall立体圆柱
  9. cea|Cylindrical Equal Area|  等面积圆柱体投影法
  10. lcc|Lambert Conformal| 兰勃特投影
  11. laea|Lambert Azimuthal Equal Area| 兰伯特正方位等面积投影
  12. nplaea|North-Polar Lambert Azimuthal| 北极兰伯特方位
  13. splaea|South-Polar Lambert Azimuthal| 南极兰伯特方位
  14. eqdc|Equidistant Conic| 地图投影
  15. aeqd|Azimuthal Equidistant| 等距方位投影
  16. npaeqd|North-Polar Azimuthal Equidistant| 北极等距方位投影
  17. spaeqd|South-Polar Azimuthal Equidistant| 南极等距方位投影
  18. aea|Albers Equal Area| 亚尔勃斯等积投影
  19. stere|Stereographic| 平射投影
  20. npstere|North-Polar Stereographic| 北极平射投影
  21. spstere|South-Polar Stereographic| 南极平射投影
  22. cass|Cassini-Soldner|
  23. poly|Polyconic| 多锥体投影
  24. ortho|Orthographic|  正交投影
  25. geos|Geostationary| 对地静止投影
  26. nsper|Near-Sided Perspective|
  27. sinu|Sinusoidal| 正弦投影
  28. moll|Mollweide|  摩尔维特投影
  29. hammer|Hammer|
  30. robin|Robinson|
  31. kav7|Kavrayskiy VII|
  32. eck4|Eckert IV|
  33. vandg|van der Grinten|
  34. mbtfpq|McBryde-Thomas Flat-Polar Quartic|
  35. gnom|Gnomonic|
  36. rotpole|Rotated Pole|
复制代码

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-3-17 21:21:14 | 显示全部楼层
morgnisol 发表于 2020-2-28 00:11
请问楼主问题解决了吗?我使用Cartopy出了兰伯特投影的图,一是只能画出矩形图,二是兰伯特的经纬线不知怎 ...

并没有。。确实只能画出矩形图
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-3-17 21:23:20 | 显示全部楼层
青羽 发表于 2020-3-9 14:37
basemap 中用 projection  = 'lcc',  即可,示例代码如下:

感谢你的热心,但这并没有实现最外边框为扇形的效果。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-4-29 16:48:45 | 显示全部楼层
morgnisol 发表于 2020-2-28 00:11
请问楼主问题解决了吗?我使用Cartopy出了兰伯特投影的图,一是只能画出矩形图,二是兰伯特的经纬线不知怎 ...

用Cartopy添加兰伯特经纬线很容易啊,ax.gridlines(linestyle='--')就好了。
不过,添加经纬线的标记很麻烦。。我放弃了。
用basemap就很方便。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2023-7-7 17:31:04 | 显示全部楼层
cutoff参数表示地图的截断纬度,地图将在与中心点相反的极点处截断。cutoff的默认值为-30,表示地图将在南极点处截断。如果想要在北极点处截断,可以将cutoff设置为正值,例如30。
import cartopy.crs as ccrs
import matplotlib.pyplot as plt

# Create some dummy data
import numpy as np
lon = np.linspace(-80, 80, 25)
lat = np.linspace(30, 70, 25)
lon2d, lat2d = np.meshgrid(lon, lat)
data = np.cos(np.deg2rad(lat2d) * 4) + np.sin(np.deg2rad(lon2d) * 4)

# The data are defined in lat/lon coordinate system, so PlateCarree() is the appropriate choice
data_crs = ccrs.PlateCarree()

# Create a Lambert Conformal projection with different cutoff values
projection1 = ccrs.LambertConformal(central_longitude=-96.0, central_latitude=39.0, cutoff=-30)
projection2 = ccrs.LambertConformal(central_longitude=-96.0, central_latitude=39.0, cutoff=30)

# Plot the data using the two projections
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6), subplot_kw={'projection': projection1})
ax1.set_global()
ax1.coastlines()
ax1.contourf(lon, lat, data, transform=data_crs)
ax1.set_title('Lambert Conformal with cutoff=-30')

ax2.coastlines()
ax2.contourf(lon, lat, data, transform=data_crs)
ax2.set_title('Lambert Conformal with cutoff=30')
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表