sf в r — одна проекция работает, другая выдает недопустимую геометрическую ошибку

#r #gis #sf #map-projections

#r #гис #sf #карта-проекции

Вопрос:

Я пытаюсь нарисовать несколько карт с sf помощью и ggplot2 , и у меня какое — то странное поведение. Я запускал карту перед использованием проекции EPSG с номером 3310, и это сработало нормально:

 world lt;- st_read("world_map_path.shp") syear lt;- st_read("data_path.shp") proj lt;- 3310  ggplot(data = world)     geom_sf()     geom_sf(data=syear, aes(fill=owner), size=0.2)    coord_sf(crs=proj)  

Приведенный выше код не возвращает ошибок и отлично отображает карту. Однако выполнение почти точно такого же кода с введенной вручную орфографической проекцией приводит к недопустимой ошибке геометрии. Код:

 world lt;- st_read("world_map_path.shp") syear lt;- st_read("data_path.shp") proj lt;- " proj=ortho  lon_0=35  lat_0=90"  ggplot(data = world)     geom_sf()     geom_sf(data=syear, aes(fill=owner), size=0.2)    coord_sf(crs=proj)  

Ошибка:

 Error in CPL_geos_is_empty(st_geometry(x)) :  Evaluation error: IllegalArgumentException: Invalid number of points in LinearRing found 2 - must be 0 or gt;= 4. Calls: lt;Anonymousgt; ... st_as_grob.sfc_MULTIPOLYGON -gt; st_is_empty -gt; CPL_geos_is_empty Execution halted  

Что я здесь делаю не так? Есть ли ошибка в моем коде или в моих входных данных? В чем может заключаться указанная ошибка?

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

1. Не могли бы вы попробовать отфильтровать (потенциальные) пустые геометрии с помощью syear lt;- st_read("data_path.shp") %gt;% filter(!st_is_empty(geometry)) .

2. @mgrund, который просто выдает ошибку — Ошибка в данных.матрица(данные): объект «список» нельзя принудительно ввести «двойные» вызовы: %gt;% … фильтр -gt; как.ts -gt;gt; как.ts.по умолчанию -gt;gt;gt; ts -gt;gt;gt;gt; данные.матрица

3. Что вы получаете при подаче st_is_valid() заявки на два ваших dfs, содержащих геометрию? Похоже, что некоторые из ваших данных содержат недопустимые полигоны (кольца с менее чем 4 точками).

4. @mgrund Это странная часть — он возвращает кучу допустимых полигонов для первого и по крайней мере один недопустимый полигон для второго, но полное удаление второго источника данных и простое построение первого все равно приводит к ошибке. Короче говоря, в соответствии с st_is_valid() тем, что в первом наборе данных нет недопустимых полигонов, но когда я запускаю программу только для первого набора данных, она все равно возвращает ошибку недопустимого полигона. Эта ошибка исчезает при другой проекции карты.