Как создать шейп-файл из сюжета matplotlib? - PullRequest
2 голосов
/ 26 апреля 2019

Я хочу создать шестиугольную сетку внутри многоугольника (представляющего географическую зону), где я могу выбрать цвет каждого шестиугольника.

Что я сделал:

  • рисоватьмногоугольник в 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()

И получившаяся карта:

resulting map

В качестве альтернативы, если у вас есть лучший способ нарисовать карту такого типа без необходимости создавать кучу точек, это тоже было бы здорово.

...