python - 把北美分成几块
问题描述
我正在尝试创建北美地图的 voronoi 图,这意味着根据首都的位置有效地将国家分割成碎片。为此,我使用 Geopandas 获取北美的地理数据,然后使用 GeoVoronoi 库从中创建一个 Voronoi 图:
import matplotlib.pyplot as plt
import geopandas as gpd
from shapely.ops import cascaded_union
from geovoronoi.plotting import subplot_for_map, plot_voronoi_polys_with_points_in_area
from geovoronoi import voronoi_regions_from_coords, points_to_coords
logging.basicConfig(level=logging.INFO)
geovoronoi_log = logging.getLogger('geovoronoi')
geovoronoi_log.setLevel(logging.INFO)
geovoronoi_log.propagate = True
#
# load geo data
#
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
cities = gpd.read_file(gpd.datasets.get_path('naturalearth_cities'))
# focus on South America, convert to World Mercator (unit: meters)
north_am = world[world.continent == 'North America'].to_crs(epsg=3395)
cities = cities.to_crs(north_am.crs) # convert city coordinates to same CRS!
# create the bounding shape as union of all South American countries' shapes
north_am_shape = cascaded_union(north_am.geometry)
north_am_cities = cities[cities.geometry.within(north_am_shape)] # reduce to cities in South America
#
# calculate the Voronoi regions, cut them with the geographic area shape and assign the points to them
#
# convert the pandas Series of Point objects to NumPy array of coordinates
coords = points_to_coords(north_am_cities.geometry)
# calculate the regions
poly_shapes, pts, poly_to_pt_assignments = voronoi_regions_from_coords(coords, north_am_shape)
#
# Plotting
#
fig, ax = subplot_for_map()
plot_voronoi_polys_with_points_in_area(ax, north_am_shape, poly_shapes, pts)
ax.set_title('Cities data for South America from GeoPandas\nand Voronoi regions around them')
plt.tight_layout()
plt.savefig('using_geopandas.png')
plt.show()
解决方案
您收到的错误是由于您正在提取的城市信息包含北美的几个城市,或者它们没有被正确地识别为在北美的边界内。您的问题是关于创建基于首都的 Voronoi 图,因此我包含了指向美国首都数据集的链接,以便您可以使用可靠数量的城市测试示例:
import matplotlib.pyplot as plt
import numpy as np
import geopandas as gpd
from geovoronoi.plotting import subplot_for_map, plot_voronoi_polys_with_points_in_area
from geovoronoi import voronoi_regions_from_coords
cities = gpd.read_file('us-state-capitals.csv')
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
usa = world[world.name == 'United States of America']
usa = usa.to_crs(epsg=3857)
usa_shape = usa.iloc[0].geometry
coords = np.array(list(zip(cities.Shape_X,cities.Shape_Y)), dtype='float')
poly_shapes, pts, poly_to_pt_assignments = voronoi_regions_from_coords(coords, usa_shape)
fig, ax = subplot_for_map()
plot_voronoi_polys_with_points_in_area(ax, usa_shape, poly_shapes, coords)
ax.set_title('Cities data for South America from GeoPandas\nand Voronoi regions around them')
plt.tight_layout()
plt.savefig('using_geopandas.png')
plt.show()
生产:
对于北美,您可以下载城市 CSV并使用以下代码:
import matplotlib.pyplot as plt
import geopandas as gpd
from shapely.ops import cascaded_union
from geovoronoi.plotting import subplot_for_map, plot_voronoi_polys_with_points_in_area
from geovoronoi import voronoi_regions_from_coords, points_to_coords
cities = gpd.read_file('world_populated_cities.csv')
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
na = world[world.continent == 'North America']
na = na.to_crs(epsg=3857)
cities.geometry.to_crs(epsg=3857)
na_shape = cascaded_union(na.geometry)
cities = cities.to_crs(na.crs) # convert city coordinates to same CRS!
cities = cities[cities.geometry.within(na_shape)]
coords = points_to_coords(cities.geometry)
poly_shapes, pts, poly_to_pt_assignments = voronoi_regions_from_coords(coords, na_shape)
fig, ax = subplot_for_map()
plot_voronoi_polys_with_points_in_area(ax, na_shape, poly_shapes, coords)
ax.set_title('Cities data for South America from GeoPandas\nand Voronoi regions around them')
plt.tight_layout()
plt.savefig('using_geopandas.png')
plt.show()
生产:
推荐阅读
- ruby-on-rails - 显示使用回形针导轨上传的文档
- python - 如何在同一脚本中安排 RDS 快照和还原
- wordpress - Woocommerce 结帐时强制自定义单选按钮选择
- javascript - 试图弄清楚为什么没有捕获到抛出的错误
- pandas - 使用 Geopandas 将包含多边形坐标的元组保存到 Shapefile
- python - 为什么 tkinter 使用黑色填充颜色而不是我指定的颜色?
- laravel - 我如何在 Guzzle 之类的东西中发出相同的 curl 请求?
- mysql - Sql:使用第一个表中的日期从第二个表中查找列的总和
- c# - 如何不明确指定名称自动匹配的成员?
- android - 房间库类型转换器在 Kotlin 中不起作用