Базовая карта readshapefile ValueError

Я скачал карту из переписи населения США в формате шейп-файла. В нем есть вся необходимая информация, которая мне нужна, но по какой-то причине мне нужна конкретная карта, которая дает мне эту ошибку:

Traceback (most recent call last):
  File "C:/Users/Leb/Desktop/Python/Kaggle/mapp.py", line 17, in <module>
    shp_info = m.readshapefile('gis/cb_2014_us_state_5m', 'states', drawbounds=True)
  File "C:\Program Files\Python 3.5\lib\site-packages\mpl_toolkits\basemap\__init__.py", line 2162, in readshapefile
    raise ValueError('readshapefile can only handle 2D shape types')
ValueError: readshapefile can only handle 2D shape types

В частности, эти наборы файлов вызывают у меня ошибку. Как видите, я скачал шейп-файл с разрешением 5m.

Это код, который я использую для выполнения команды:

import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap as Basemap

m = Basemap(llcrnrlon=-119, llcrnrlat=22, urcrnrlon=-64, urcrnrlat=49,
            projection='lcc', lat_1=33, lat_2=45, lon_0=-95)
shp_info = m.readshapefile('gis/cb_2014_us_state_5m', 'states', drawbounds=True)

Вопросы:

  1. Нужно ли конвертировать это через Fiona? или ArcGIS? для того, чтобы изменить его на правильный формат.
  2. Есть ли лучшая альтернатива basemap?

person Leb    schedule 29.10.2015    source источник
comment
Вы решили это?   -  person Gonzalo Garcia    schedule 12.09.2019


Ответы (1)


Проблема в том, что эти файлы cb_ представляют собой списки стройных 3D-объектов PolygonZ, а readshapefile требует, чтобы они были объектами 2D-полигонов, даже если размерность Z полностью равна 0, как в случае с этими файлами cb_*. Вы можете преобразовать их, удалив размер Z.

Я начал использовать геопанды в качестве оболочки для базовой карты и других утилит, и вот как я их преобразовал:

def convert_3D_2D(geometry):
    '''
    Takes a GeoSeries of Multi/Polygons and returns a list of Multi/Polygons
    '''
    import geopandas as gp
    new_geo = []
    for p in geometry:
        if p.has_z:
            if p.geom_type == 'Polygon':
                lines = [xy[:2] for xy in list(p.exterior.coords)]
                new_p = Polygon(lines)
                new_geo.append(new_p)
            elif p.geom_type == 'MultiPolygon':
                new_multi_p = []
                for ap in p:
                    lines = [xy[:2] for xy in list(ap.exterior.coords)]
                    new_p = Polygon(lines)
                    new_multi_p.append(new_p)
                new_geo.append(MultiPolygon(new_multi_p))
    return new_geo

import geopandas as gp
some_df = gp.from_file('your_cb_file.shp')
some_df.geometry = convert_3D_2D(cbsa.geometry)

Установите GeoPandas с помощью pip install geopandas. Я думаю так и должно быть!

person paulperry    schedule 04.02.2016
comment
У меня это не сработало, from_file больше не поддерживается в геопандах - person Gonzalo Garcia; 12.09.2019