Shapely MultiLinestring отображается как MultiPolygon в Pyplot

Цель: рисование MultiPolygon (суша) и MultiLinestring (реки) на одном и том же рисунке. Окрашивая землю в белый цвет.

Проблема: кажется, что MultiLinestring отображается как MultiPolygon, построенный путем автоматического закрытия всех его Linestrings, чтобы сделать их многоугольниками.

Контроль: при окрашивании MultiPolygon в белый цвет не окрашивается то, что кажется многоугольником, состоящим из Linestrings из MultiLinestring.

Вот воспроизводимый код:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader
from cartopy.feature import ShapelyFeature

# creates a map
map_projection = ccrs.PlateCarree(central_longitude=0.0, globe=None)
map_figure = plt.figure()
map_subplot = plt.axes(projection=map_projection)
# limits the display bounds of the map
map_subplot.set_extent((5.2, 31.4, 35, 54.3), crs=map_projection)

# adding land from a local shp (source : Natural Earth website)
# facecolor = white
landshpfilename = "Central Europe _ lands minus lakes.shp"
landshapereader = shpreader.Reader(landshpfilename)
landshape_feature = ShapelyFeature(landshapereader.geometries(), map_projection, facecolor='white',edgecolor='black')
map_subplot.add_feature(landshape_feature)

# adding large river from a local shp (source : Natural Earth website)
# edgecolor = blue
largeriversshpfilename = "Central Europe _ large rivers minus lakes.shp"
largeriversshapereader = shpreader.Reader(largeriversshpfilename)
largeriversshape_feature = ShapelyFeature(largeriversshapereader.geometries(), map_projection,edgecolor='blue')
map_subplot.add_feature(largeriversshape_feature)

# verifying the geom_type of the first objects in the shapefiles
# putting it as a title
land_geom_type_text = ' '.join(['lands geom_type :',next(landshape_feature.geometries()).geom_type])
river_geom_type_text = ' '.join(['rivers geom_type :',next(largeriversshape_feature.geometries()).geom_type])
map_figure.suptitle('\n'.join([land_geom_type_text,river_geom_type_text]))

plt.show()

Вот результат: отрисованная карта

Вопрос: Как это исправить?


person Tehem    schedule 11.07.2018    source источник
comment
У нас нет доступа к файлам .shp, на которые вы ссылаетесь в своем коде. Можете ли вы изменить их на простую ссылку geojson? Вы можете читать шейп-файлы (и преобразовывать их в формат json) с помощью fiona.   -  person Micks Ketches    schedule 11.07.2018
comment
Ответ на этот вопрос показывает что cartopy может каким-то образом превратить геометрию в многоугольник, а затем раскрасить его соответствующим образом.   -  person gepcel    schedule 12.07.2018
comment
@Micks Ketches Я не думаю, что шейп-файлы здесь уместны, но для протокола: это фрагменты суши и рек + центральные линии озер по адресу naturalearthdata.com/downloads/10m-physical-vectors. Кроме того, увидев ответ gepcel, я думаю, мне придется найти другой способ их построения, например, из geojson или wkt.   -  person Tehem    schedule 12.07.2018
comment
@gepcel Спасибо за ответ. Из ответа Пелсона я понимаю, что моя проблема пока неразрешима. Ваш вопрос и ответ на него относятся к 2014 году. С тех пор вы обращались к команде проекта Cartopy с заявлением о проблеме?   -  person Tehem    schedule 12.07.2018
comment
@Tehem Нет, я не подавал никаких вопросов. В то время я искал способ построения точек и остановился на plt.scatter.   -  person gepcel    schedule 14.07.2018
comment
Быстрое решение: установите facecolor='none' (обратите внимание, что это строка none, а не объект None - это matplotlib-ism...)   -  person pelson    schedule 24.07.2018


Ответы (1)


Установка facecolor='none' не позволит matplotlib заполнить созданный базовый путь. Быстро воспроизводимый случай:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature


ax = plt.axes(projection=ccrs.PlateCarree())

# Create a feature for States/Admin 1 regions at 1:50m from Natural Earth
states_provinces = cfeature.NaturalEarthFeature(
    category='physical',
    name='rivers_lake_centerlines',
    scale='110m',
    )

ax.add_feature(states_provinces, edgecolor='gray', linewidth=5)
ax.coastlines()

Наполненные реки, буоо!

Сохранение всего остального таким же, но изменение конструкции функции, чтобы не задавать цвет лица, дает желаемый результат:

states_provinces = cfeature.NaturalEarthFeature(
    category='physical',
    name='rivers_lake_centerlines',
    scale='110m',
    facecolor='none'
    )

Риверс, ура!

person pelson    schedule 24.07.2018
comment
Мне удалось получить правильный вид, придав полигонам рек тот же цвет лица, что и земля. В моем случае я повернул оба 'white', и полигоны рек не отображаются. Ваше решение, 'none' (а не None, как я пытался ранее), работает лучше, я думаю, потому что оно адаптивно. Тем не менее, я боюсь, что у меня возникнут проблемы при проверке того, находятся ли точки над линиями линий рек или внутри полигонов суши, поскольку у рек все еще есть свои собственные полигоны сверху. Я вернусь к этому позже. - person Tehem; 24.07.2018