#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()
тем, что в первом наборе данных нет недопустимых полигонов, но когда я запускаю программу только для первого набора данных, она все равно возвращает ошибку недопустимого полигона. Эта ошибка исчезает при другой проекции карты.