Невозможно построить линейную строку sf в R: ошибка в CPL_geos_is_empty (st_geometry (x)) - PullRequest
1 голос
/ 15 октября 2019

У меня есть точки трека урагана, которые я преобразовал в линии в QGIS:

https://i.imgur.com/PUOTpsi.png

https://i.imgur.com/5cbCdX2.png

Я сохранил оба файла в виде шейп-файлов и загрузил их вR используя пакет sf. Точки будут построены с использованием стандартной функции plot(), но линии не будут.

Я столкнулся с ошибкой:

plot(hurricane_paths)
Error in CPL_geos_is_empty(st_geometry(x)) : 
     Evaluation error: IllegalArgumentException: point array must contain 0 or >1 elements.

У меня такая же ошибка, когда я использую plot(st_geometry(hurricane_paths))

R определенно загружается в геометрии, хотя:

> hurricane_paths
Simple feature collection with 1410 features and 5 fields
geometry type:  LINESTRING
dimension:      XY
bbox:           xmin: -179.9 ymin: -4.9 xmax: 8 ymax: 70.7
epsg (SRID):    4269
proj4string:    +proj=longlat +datum=NAD83 +no_defs
First 10 features:
             N.A begin  end Year           N.A_1                       geometry
1  1976143N24271  <NA> <NA> 1976 SUBTROP:UNNAMED LINESTRING (-89 24, -89.6 2...
2  1976155N11265  <NA> <NA> 1976         ANNETTE LINESTRING (-95 11.4, -95.2...
3  1976159N27281  <NA> <NA> 1976         UNNAMED LINESTRING (-79 26.8, -78.5...

И st_geometry(hurricane_paths) возвращает

Geometry set for 1410 features 
geometry type:  LINESTRING
dimension:      XY
bbox:           xmin: -179.9 ymin: -4.9 xmax: 8 ymax: 70.7
epsg (SRID):    4269
proj4string:    +proj=longlat +datum=NAD83 +no_defs
First 5 geometries:
LINESTRING (-89 24, -89.6 24.8, -90 25.4, -90.5...
LINESTRING (-95 11.4, -95.2 11.7, -95.3 12.1, -...
LINESTRING (-79 26.8, -78.5 28, -78.1 29.2, -77...
LINESTRING (-81 26.5, -78.5 28.2, -76.2 30, -73...
LINESTRING (-103 16, -104.1 15.8, -105.1 15.8, ...

Я уже проверил NA в моем столбце геометрии:

> which(is.na(hurricane_paths$geometry)==T)
integer(0)

plot_sf() не возвращает никакого сообщения об ошибке, но возвращает пустой экран на панели графиков, так что это тоже не нужно.

Но ggplot2 великолепен и возвращаетграфика, без проблем:

> ggplot() + 
+   geom_sf(data = hurricane_paths)

Mapview тоже в порядке: > mapview::mapview(hurricane_paths)

Но основная функция plot() остается упрямой. В чем может быть проблема?

Ответы [ 2 ]

1 голос
/ 26 октября 2019

У меня была такая же проблема, как и у вас, и кажется, что проблема в преобразовании из точек в линейную строку. Следуя решению, найденному в теме Создание мультилиней из точек, сгруппированных по идентификатору с пакетом sf , вам может потребоваться использовать

summarise(do_union = FALSE) %>%
st_cast("LINESTRING")

перед преобразованием набора точечных данных в линейную строку.

Надеюсь, это поможет.

0 голосов
/ 17 октября 2019

Трудно помочь без данных. st_length(hurricane_paths) показывает геометрию нулевой длины? Что если вы построите подмножество, например, plot(hurricane_paths[1:10,]) для построения первых десяти?

Я могу продублировать вашу ошибку, создав линию с одной точкой:

> Line = st_sfc(st_linestring(x = matrix(1, ncol=2, nrow=1), dim = "XYZ"))
> g = st_sf(data.frame(x=1, geom=Line))
> plot(g)
Error in CPL_geos_is_empty(st_geometry(x)) : 
  Evaluation error: IllegalArgumentException: point array must contain 0 or >1 elements.

Я подозреваючто однокоординатная «линия» недопустима в спецификации Simple Features и должна действительно приводиться к геометрии POINT или, возможно, фиксироваться путем добавления второй идентичной координаты, чтобы она все еще была линией, но имела две точки.

Вы можете использовать st_is_valid, чтобы обнаружить подобные вещи (и даже говорить о LINESTRING с одной точкой), а затем привести их к POINT, или удалить их, или обработать их соответствующим образом для вашего анализа.

...