Как фильтровать строки WKT с недопустимой геометрией в pandas или GeoPandas

#python #geopandas #shapely #wkt

#python #geopandas #стройный #wkt

Вопрос:

Я пытаюсь преобразовать файл Excel в фрейм данных GeoPandas. Я пытаюсь использовать для этого Shapely и WKT.

После чтения файла в pandas у меня есть столбец геометрии. Я пытаюсь сделать следующее, чтобы преобразовать столбец геометрии в тип данных «объект»:

 from shapely import wkt

my_df['geometry'] = my_df['geometry'].apply(wkt.loads)
  

и я получаю следующую ошибку:

 WKTReadingError: Could not create geometry because of errors while reading input.
  

Чтобы попытаться определить, в чем проблема, я также попытался преобразовать этот файл Excel в фрейм геоданных, используя следующий код:

 import geopandas

my_df = gpd.GeoDataFrame(my_df, geometry='geometry')
  

и я получаю следующую ошибку:

 TypeError: Input must be valid geometry objects: MULTIPOLYGON (((1314112.145833299 1027703.927083313, 1314091.947916642 1027761.937499985, 1314232.583333299 1027811.447916642, 1314240.99999997 1027814.395833313, 1314246.739583299 1027794.468749985, 1314292.71874997 1027692.947916642, 1314282.18749997 1027689.010416642, 1314136.364583299 1027634.374999985, 1314112.145833299 1027703.927083313)))
  

Похоже, у меня только одна плохая геометрия? (Или это может быть просто первая плохая геометрия).

Могу ли я просто пропустить этот плохой wkt.loads шаг? Я не смог найти документацию или другие примеры того, как это сделать.

Ответ №1:

Вы можете выполнить цикл вместо apply с помощью try/except, чтобы перехватить ошибочную геометрию.

 from shapely import wkt

geom = []

for g in my_df['geometry']:
    try:
        geom.append(wkt.loads(g))
    except:
        geom.append(None)

my_df['geometry'] = geom
  

Комментарии:

1. Первые 2 строки такие же, как в вопросе. Согласно вопросу, вторая строка вызовет ошибку.

2. @swatchai спасибо, забыл удалить его после копирования.

Ответ №2:

Попробуйте этот простой код для построения только допустимой геометрии:

 my_df[ my_df.geometry.is_valid ].plot(ec='black', alpha=0.3)
  

Чтобы получить только допустимые геометрии в новом фрейме геоданных:

 valid_gdf = my_df[ my_df.geometry.is_valid ]
  

Комментарии:

1. Это не отвечает на вопрос выше.