Я хочу создать шестиугольную сетку внутри многоугольника (представляющего географическую зону), где я могу выбрать цвет каждого шестиугольника.
Что я сделал:
- рисоватьмногоугольник в Qgis на карте
- создать сетку точек внутри многоугольника
- добавить точки, где я хочу более высокую плотность
- загрузить все эти точки в информационном кадре геопанды
- построить гексбин из этих точек
Это сетка, которую я хочу!
Теперь мне нужно экспортировать ее как шейп-файл, но я не могу найти способполучить шейп-файл из сюжета?
Код питона:
df = gpd.read_file("points.geojson")[['geometry']].to_crs(epsg=3857)
def get_coords(geom, i):
if type(geom) == MultiPoint:
geom = Point(geom[0])
coords = geom.x, geom.y
return coords[i]
df['X'] = df.apply((lambda x: get_coords(x.geometry, 0)), axis=1)
df['Y'] = df.apply((lambda x: get_coords(x.geometry, 1)), axis=1)
def add_basemap(ax, zoom, url='http://tile.stamen.com/terrain/tileZ/tileX/tileY.png'):
xmin, xmax, ymin, ymax = ax.axis()
basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url)
ax.imshow(basemap, extent=extent, interpolation='bilinear')
# restore original x/y limits
ax.axis((xmin, xmax, ymin, ymax))
f, ax = plt.subplots(1, figsize=(15, 15))
hexbin = ax.hexbin(df.X, df.Y, gridsize=30, alpha=0.5, cmap='RdYlGn', mincnt=1)
add_basemap(ax, zoom=15)
plt.colorbar(hexbin)
plt.axis('off')
plt.show()
И получившаяся карта:
В качестве альтернативы, если у вас есть лучший способ нарисовать карту такого типа без необходимости создавать кучу точек, это тоже было бы здорово.