将北美划分为碎片

我正在尝试创建北美地图的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()

这些代码大部分直接取自 Geovoronoi 文档。然而,当我运行它时,我收到以下错误:

http://img.mukewang.com/62fb76950001a6e409270327.jpg

千万里不及你
浏览 115回答 1
1回答

aluckdog

您收到的错误源于以下事实:您正在提取的城市信息包含北美城市很少,或者它们未被正确识别为北美境内。您的问题是关于基于首都创建Voronoi图,因此我包含了一个指向美国首都数据集的链接,以便您可以使用可靠数量的城市测试示例:import matplotlib.pyplot as pltimport numpy as npimport geopandas as gpdfrom geovoronoi.plotting import subplot_for_map, plot_voronoi_polys_with_points_in_areafrom geovoronoi import voronoi_regions_from_coordscities = 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].geometrycoords = 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 pltimport geopandas as gpdfrom shapely.ops import cascaded_unionfrom geovoronoi.plotting import subplot_for_map, plot_voronoi_polys_with_points_in_areafrom geovoronoi import voronoi_regions_from_coords, points_to_coordscities = 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()生产:
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python