В этом geopandas
примере, масса Антарктиды опускается с GeoDataFrame
перед перепроецированием в проекцию Меркатора, чтобы предотвратить проблему с фигурами, содержащими полюс (который станет бесконечно большим ).
Мне было интересно, можно ли найти более надежный метод перепроецирования, чтобы не пришлось настраивать кадр данных вручную. Тем более, что я работаю с набором данных, который не имеет отдельной строки для Антарктиды:
У меня есть две идеи:
1. Используйте информацию о пункте назначения crs
На веб-сайте epsg , например, отображается «Область использования»:
Мы могли бы использовать его для подготовки данных перед перепроецированием: отбросить любые фигуры, которые простираются дальше на юг, чем -80 градусов, или, альтернативно, пересечь его с shapely Polygon
, который описывает область использования пункта назначения. С точки зрения исходного crs - в данном случае стандарт epsg:4326
, поэтому Polygon([(-180,-80), (-180,84), ...])
.
Проблема с этим подходом : Я не уверен, если эта область использования информации программно доступна откуда-либо для любого crs
, например, из объекта GeoDataFrame
.
2. Исправьте в посте
Просто сделайте это и выберите ошибочно перепроектированные детали позже. Например, в моем текущем случае перепроецированный геоданный gdf_merc = gdf.to_crs(epsg=3395)
имеет ошибки ...
... но при поиске inf
слово в строковом представлении геометрии, я могу найти оскорбительный Polygon
в пределах MultiPolygon
...
In [360]: for i, polygon in enumerate(gdf_merc.geometry[0]):
...: if 'inf' in str(polygon):
...: print(i)
0
... и просто удалить его:
Проблема с этим подходом : кажется сложной, и я бы предпочел не допустить появления проблем вообще.
Любые мысли о том, как исправить любой из этих методов, или есть третий способ?
Одно замечание: меня интересует общий случай, когда любые crs могут быть перепроектированы, поэтому я не хочу превентивно удалять Антарктику («на всякий случай»), так как другие проекции могут быть в порядке с ней, и, что более важно, у них могут быть другие проблемные области.
Большое спасибо!