R 中的 sfc 几何中缺少 Z 坐标

问题描述 投票:0回答:1

我在编程和 R 方面确实是新手。我有一组街道网络,并且每个网络的分段已通过使用 QGIS 进行分解。使用

st_read
后,我发现我的sfc街道网络的几何类型是MULTILINESTRING,本来应该是LINESTRING。

> library(sf)
> library(spNetwork)
> library(tmap)
> library(tidyverse)
> library(tmaptools)

> # Import street shp file
> street_cakung <- st_read(dsn = "Akademik/Semester 7/Final Boss TA/File GIS/Analisis R Studio/Data SHP/Kecamatan/Street_Cakung.shp")
Reading layer `Street_Cakung' from data source 
  `C:\Users\daksa\Documents\Akademik\Semester 7\Final Boss TA\File GIS\Analisis R Studio\Data SHP\Kecamatan\Street_Cakung.shp' using driver `ESRI Shapefile'
Simple feature collection with 57230 features and 1 field
Geometry type: MULTILINESTRING
Dimension:     XY, XYZ
Bounding box:  xmin: 710319.8 ymin: 9312174 xmax: 718316.9 ymax: 9319672
z_range:       zmin: 0 zmax: 0
Projected CRS: WGS 84 / UTM zone 48S```

然后,我尝试使用

st_cast
进行转换,它可以分割 MULTILINESTRINGS 对象,因此它显示结果

st_cleaned <- st_cast(street_cakung,to = "LINESTRING")

Geometry set for 57233 features 
Geometry type: LINESTRING
Dimension:     XYZ
Bounding box:  xmin: 710319.8 ymin: 9312174 xmax: 718316.9 ymax: 9319672
Projected CRS: WGS 84 / UTM zone 48S
First 5 geometries:
LINESTRING Z (714868.2 9318798 0, 714876.2 9318...
LINESTRING Z (714940.4 9315617 0, 714937.4 9315...
LINESTRING Z (717801.7 9317100 0, 717796.6 9317...
LINESTRING Z (717473.8 9313510 0, 717473.6 9313...
LINESTRING Z (713879.8 9313725 0, 713879.7 9313...

但是,当我尝试使用

lixelize_lines
by
spNetwork package
分析它时,它显示错误:

> # Calculating lixels to use as sampling points
> lixels <- lixelize_lines(st_cleaned,300,mindist = 50)
Error in (function (..., deparse.level = 1)  : 
  number of columns of matrices must match (see arg 14201)

当我观察

nrow == 14201
处的data.frame时,我发现该对象缺少Z值或Z坐标,因此它只是被读取为矩阵2x2(XX,YY),而正确的应该是矩阵2x3(XX,YY) , Z Z)。有几个对象也可能会丢失 z 值。打印结果是:

st_geom <- st_geometry(st_cleaned)
> st_geom[[14201]]
LINESTRING Z (713989.2 9318923, 713989 9318930)

我真的很困惑如何存储 z 值,使其具有 (0, 0)。有什么解决办法吗?如果有人能帮助我我真的很感激

我一直在尝试使用

st_zm
强制添加 Z 坐标,但它不起作用并显示错误

> st_zm(st_cleaned$geometry[[14201]], drop = FALSE, what = "Z")
Error in st_zm.sfg(st_cleaned$geometry[[14201]], drop = FALSE, what = "Z") : 
  adding Z only supported for XY geometries
r coordinates gis r-sf multilinestring
1个回答
0
投票

最终,最稳健的解决方案是找出 QGIS 首先添加 z 维度的原因,然后如果可能的话阻止这种情况发生。但是,这里是基于您的数据和评论的代表,概述了不同的选项:

套餐和数据:

library(sf) # sf_1.0-16
library(dplyr) # dplyr_1.1.4

# Create example sf with XY and XYZ dimension features
set.seed(1)
sf_lines <- data.frame(latitude = runif(5, min = 9312174, max = 9319672),
                  longitude = runif(5, min = 710319.8, max = 718316.9)) %>%
  st_as_sf(coords = c("longitude", "latitude"), crs = 32748) %>%
  st_union() %>% 
  st_voronoi() %>%
  st_collection_extract() %>%
  st_as_sf() %>%
  st_cast("LINESTRING") %>%
  st_zm(0, drop = FALSE, what = "Z")
 
sf_lines1 <- sf_lines[5,] %>%
  st_coordinates() %>%
  data.frame() %>%
  select(X, Y) %>%
  st_as_sf(coords = c("X", "Y"), crs = 32748) %>%
  st_union() %>%
  st_cast("LINESTRING") %>%
  st_as_sf() %>%
  rbind(sf_lines[1:4,], .)

sf_lines1
# Simple feature collection with 5 features and 0 fields
# Geometry type: LINESTRING
# Dimension:     XY, XYZ
# Bounding box:  xmin: 703753.4 ymin: 9306626 xmax: 724935 ymax: 9326044
# z_range:       zmin: 0 zmax: 0
# Projected CRS: WGS 84 / UTM zone 48S
#                                x
# 1 LINESTRING Z (703753.4 9306...
# 2 LINESTRING Z (703753.4 9326...
# 3 LINESTRING Z (724935 931121...
# 4 LINESTRING Z (718257.5 9318...
# 5 LINESTRING (714198.5 931337...

如果您尝试将 z 值添加到整个数据集:

sf_lines1 <- st_zm(sf_lines1, 0, drop = FALSE, what = "Z")

它将返回此错误:

st_zm.sfg(X[[i]], ...) 中的错误:
添加 Z 仅支持 XY 几何形状

那是因为你的一些线串已经有 z 值。如果您确实需要,您可以单独添加 z 值:

sf_lines1[5,] %>% st_zm(sf_lines1[5,], 0, drop = FALSE, what = "Z")

# Simple feature collection with 1 feature and 0 fields
# Geometry type: LINESTRING
# Dimension:     XYZ
# Bounding box:  xmin: 714198.5 ymin: 9306626 xmax: 724935 ymax: 9315172
# z_range:       zmin: 0 zmax: 0
# Projected CRS: WGS 84 / UTM zone 48S
#                                x
# 1 LINESTRING Z (714198.5 9313...

但是如果有很多缺失的 z 值,这将是不切实际的。鉴于您不需要它们,处理问题的最简单方法是删除所有 z 值:

# Drop z dimension
sf_lines1 <- st_zm(sf_lines1, drop = TRUE, what = "ZM")

sf_lines1
# Simple feature collection with 5 features and 0 fields
# Geometry type: LINESTRING
# Dimension:     XY
# Bounding box:  xmin: 703753.4 ymin: 9306626 xmax: 724935 ymax: 9326044
# Projected CRS: WGS 84 / UTM zone 48S
#                                x
# 1 LINESTRING (703753.4 930662...
# 2 LINESTRING (703753.4 932604...
# 3 LINESTRING (724935 9311210,...
# 4 LINESTRING (718257.5 931800...
# 5 LINESTRING (714198.5 931337...
© www.soinside.com 2019 - 2024. All rights reserved.