Как удалить фигуры, которые вызывают проблемы при перепроецировании с гео pandas данных? - PullRequest
0 голосов
/ 08 апреля 2020

В этом geopandas примере, масса Антарктиды опускается с GeoDataFrame перед перепроецированием в проекцию Меркатора, чтобы предотвратить проблему с фигурами, содержащими полюс (который станет бесконечно большим ).

Мне было интересно, можно ли найти более надежный метод перепроецирования, чтобы не пришлось настраивать кадр данных вручную. Тем более, что я работаю с набором данных, который не имеет отдельной строки для Антарктиды:

enter image description here

У меня есть две идеи:

1. Используйте информацию о пункте назначения crs

На веб-сайте epsg , например, отображается «Область использования»:

enter image description here

Мы могли бы использовать его для подготовки данных перед перепроецированием: отбросить любые фигуры, которые простираются дальше на юг, чем -80 градусов, или, альтернативно, пересечь его с shapely Polygon, который описывает область использования пункта назначения. С точки зрения исходного crs - в данном случае стандарт epsg:4326, поэтому Polygon([(-180,-80), (-180,84), ...]).

Проблема с этим подходом : Я не уверен, если эта область использования информации программно доступна откуда-либо для любого crs, например, из объекта GeoDataFrame.

2. Исправьте в посте

Просто сделайте это и выберите ошибочно перепроектированные детали позже. Например, в моем текущем случае перепроецированный геоданный gdf_merc = gdf.to_crs(epsg=3395) имеет ошибки ...

enter image description here

... но при поиске inf слово в строковом представлении геометрии, я могу найти оскорбительный Polygon в пределах MultiPolygon ...

In [360]: for i, polygon in enumerate(gdf_merc.geometry[0]):
   ...:     if 'inf' in str(polygon): 
   ...:         print(i)

0

... и просто удалить его:

enter image description here

Проблема с этим подходом : кажется сложной, и я бы предпочел не допустить появления проблем вообще.

Любые мысли о том, как исправить любой из этих методов, или есть третий способ?

Одно замечание: меня интересует общий случай, когда любые crs могут быть перепроектированы, поэтому я не хочу превентивно удалять Антарктику («на всякий случай»), так как другие проекции могут быть в порядке с ней, и, что более важно, у них могут быть другие проблемные области.

Большое спасибо!

1 Ответ

1 голос
/ 08 апреля 2020

Вариант 1, вероятно, лучший выстрел здесь. Последняя версия Geo Pandas использует pyproj.CRS для хранения данных CRS, из которых вы можете легко извлечь границы проекции.

Чтобы извлечь ее из df:

import geopandas as gpd
df = gpd.read_file(gpd.datasets.get_path('nybb'))
df.crs.area_of_use.bounds

Чтобы получить ее из Целевой CRS, используя pyproj напрямую:

import pyproj
crs = pyproj.CRS.from_epsg(3395)
crs.area_of_use.bounds

Тогда вы можете использовать встроенный geopandas.clip для обрезки ваших данных.

from shapely.geometry import box

df = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
crs = pyproj.CRS.from_epsg(3395)
bounds = crs.area_of_use.bounds
clipped = gpd.clip(df, box(*bounds))
clipped.to_crs(crs).plot()

result

...