- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想用一种颜色画出中国的轮廓,同时用另一种颜色显示全局海岸线。我第一次这样做的尝试如下:
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as feature
import cartopy.io.shapereader as shapereader
countries = shapereader.natural_earth(resolution='110m',
category='cultural',
name='admin_0_countries')
# Find the China boundary polygon.
for country in shapereader.Reader(countries).records():
if country.attributes['su_a3'] == 'CHN':
china = country.geometry
break
else:
raise ValueError('Unable to find the CHN boundary.')
plt.figure(figsize=(8, 4))
ax = plt.axes(projection=ccrs.PlateCarree())
ax.set_extent([50, 164, 5, 60], ccrs.PlateCarree())
ax.add_feature(feature.LAND)
ax.add_feature(feature.OCEAN)
ax.add_feature(feature.COASTLINE, linewidth=4)
ax.add_geometries([china], ccrs.Geodetic(), edgecolor='red',
facecolor='none')
plt.show()
我把海岸线弄得很厚,这样你就可以看到它们与国家边界重叠的事实。
我的问题是:有没有办法移除国家轮廓旁边的海岸线,这样我就不会在视觉上看到两条线相互影响?
Note: This question was asked to me directly via email, and I chose to post my response here so that others may learn/benefit from a solution.
最佳答案
Natural Earth 集合中没有名为“没有中国边界的海岸线”的数据集,因此我们将不得不自己制作它。为此,我们需要使用整形操作,尤其是 difference
方法。
差异方法如下图所示(取自Shapely's docs)。下面突出显示了两个示例圆圈(a
和 b
)的区别:
然后,我们的目标是达到编写 coaSTLine.difference(china)
的目的,并将这个结果可视化为我们的海岸线。强>
有很多方法可以做到这一点。 GeoPandas 和 Fiona 是两种可以提供非常可读的结果的技术。不过在这种情况下,让我们使用 cartopy 提供的工具:
首先,我们掌握了中国边界(另见:cartopy shapereader docs)。
import cartopy.io.shapereader as shapereader
countries = shapereader.natural_earth(resolution='110m',
category='cultural',
name='admin_0_countries')
# Find the China boundary polygon.
for country in shapereader.Reader(countries).records():
if country.attributes['su_a3'] == 'CHN':
china = country.geometry
break
else:
raise ValueError('Unable to find the CHN boundary.')
接下来,我们掌握海岸线几何图形:
coast = shapereader.natural_earth(resolution='110m',
category='physical',
name='coastline')
coastlines = shapereader.Reader(coast).geometries()
现在,把中国带出海岸线:
coastlines_m_china = [geom.difference(china)
for geom in coastlines]
当我们将其可视化时,我们发现差异并不十分完美:
我们不想要黑线的原因是 Natural Earth 海岸线数据集与国家数据集的派生方式不同,因此它们不是完全重合的坐标。
为了绕过这个事实,可以对中国边界应用一个小的“hack”来扩大边界以达到这个交叉点的目的。 buffer方法非常适合此目的。
# Buffer the Chinese border by a tiny amount to help the coordinate
# alignment with the coastlines.
coastlines_m_china = [geom.difference(china.buffer(0.001))
for geom in coastlines]
有了这个“hack”,我得到了以下结果(包含完整代码以确保完整性):
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as feature
import cartopy.io.shapereader as shapereader
coast = shapereader.natural_earth(resolution='110m',
category='physical',
name='coastline')
countries = shapereader.natural_earth(resolution='110m',
category='cultural',
name='admin_0_countries')
# Find the China boundary polygon.
for country in shapereader.Reader(countries).records():
if country.attributes['su_a3'] == 'CHN':
china = country.geometry
break
else:
raise ValueError('Unable to find the CHN boundary.')
coastlines = shapereader.Reader(coast).geometries()
# Hack to get the border to intersect cleanly with the coastline.
coastlines_m_china = [geom.difference(china.buffer(0.001))
for geom in coastlines]
ax = plt.axes(projection=ccrs.PlateCarree())
ax.set_extent([50, 164, 5, 60], ccrs.PlateCarree())
ax.add_feature(feature.LAND)
ax.add_feature(feature.OCEAN)
ax.add_geometries(coastlines_m_china, ccrs.Geodetic(), edgecolor='black', facecolor='none', lw=4)
ax.add_geometries([china], ccrs.Geodetic(), edgecolor='red', facecolor='none')
plt.show()
关于python - Cartopy:绘制删除国家边界的海岸线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45095681/
我画了两组重叠的轴,一组是另一组的放大版。我想在缩放轴的角和它在较大轴上代表的矩形的角之间画线。但是,我画的线稍微偏离了位置。我试图将其浓缩为一个简单的示例: import cartopy.crs a
我想知道给定纬度和经度,坐标是陆地还是海洋 根据https://gis.stackexchange.com/questions/235133/checking-if-a-geocoordinate-p
我已经看到了一些关于这个主题的其他问题,但是库已经发生了很大的变化,以至于这些问题的答案似乎不再适用。 栅格 used to include an example用于在 Cartopy GeoAxes
我正在为 xarray 进行一些开发。我试图安装 rasterio 但它似乎搞砸了我的 cartopy 安装。 我在我的 mac 上安装了 rasterio: brew install gdal pi
使用 basemap ,我曾经像这样添加我的自定义边界 shapefile: map = Basemap(..) map.readshapefile(file.shp, 'attribute', dr
所以,多年来我一直在 Python 2.7 中使用 Basemap,我正在转向 Python3.7 并且想转向 cartopy。我处理大量数据,其中我有投影信息,但我没有数据的纬度和经度网格。这就是我
我想要制作一个点的动画,该点沿着 map 上的一个位置到另一个位置的路径移动。 例如,我使用大地测量变换绘制了从纽约到新德里的路径。例如。取自文档 Adding data to the map plt
我想绘制来自全局多维数据集的数据,但仅限于国家/地区列表。因此,我根据国家/地区的“边界框”选择一个子立方体。 到目前为止一切顺利。我正在寻找一种简单的方法来掩盖立方体中不属于我的任何国家/地区的所有
如果我定义一组具有给定高度和宽度的(地理)轴,我如何确保绘图将填充这些轴? import matplotlib.pyplot as plt import cartopy.crs as ccrs ax
我有两个 shapefile。一个是点要素 shapefile,名为“point.shp”,另一个是名为“polygon.shp”的多边形 shapefile。我想使用 cartopy 添加到 map
我是 cartopy 的新手,仍在学习基本功能。 我试图绘制一个特定的区域,但是,当我请求 80oN 时,cartopy 扩展了这个区域并生成了一个高达大约 85oN 的 map 。有没有办法确保我只
我正在尝试在北太平洋投影上绘制 250 hPa 位势高度、1000 hPa 可降水量和 250 hPa 风速。当尝试使用倒刺时,我没有收到错误,但倒刺并没有实际显示在 map 上。我认为这可能与我的数
我想用 180 在图的底部绘制北半球的极地立体图,以便我可以强调太平洋地区。我正在使用来自 git 的最新 cartopy,并且可以制作极坐标立体图没有问题,但我无法弄清楚如何更改图底部的经度。我尝试
我正在使用 matplotlib 和 Cartopy 从二维网格数据集生成图像。以下链接中的示例如下所示: 驱动此图像创建并将出现问题的关键代码如下: dataset = Dataset('/path
我想使用 Cartopy 仅绘制一个区域(在我的例子中,北美和南美)。 我目前正在使用以下代码: import cartopy import cartopy.crs as ccrs import ma
我正在尝试使用 Cartopy 在北极立体 map 投影上创建等高线图。我使用 add_cycular_point() 尝试解决经度 0 和经度 35X 之间存在间隙的问题,并按照文档 (always
我正在尝试使用 Cartopy 和 Anaconda Python 绘制 map 点,但在转换时遇到了一些奇怪的失败。在我的简单示例中,我试图绘制 3 个点,但它们正在加倍。 import matpl
如何在 Cartopy 中绘制美国县边界? 绘制州和国家边界非常简单 ax.add_feature(cfeature.BORDERS.with_scale('50m')) ax.add_feature
我正在尝试在 OSM 图 block 之上过度绘制一些卫星图像数据。 我可以分别绘制它们,但似乎不能过度绘制,我认为这取决于投影。 我加载数据并获取投影信息 ds = gdal.Open(fname)
我正在尝试使用 cartopy 绘制北极的轮廓。我已经使用了 add_circlic_point ,这已经成功地填充了 pcolormesh 中本初子午线的间隙,但是轮廓没有成功交叉,而是绕地球一圈进
我是一名优秀的程序员,十分优秀!