【问题标题】:Is there a way to set precision for the function st_linestring?有没有办法为函数 st_linestring 设置精度?
【发布时间】:2020-03-02 08:27:22
【问题描述】:

我正在使用 sf 库函数 st_linestring 将矩阵转换为线串。当我在矩阵上使用此函数时,它会将值四舍五入为 7 位。无论有多少位数,我都需要最多 6 位小数的重要性。例如数字 109.319272 四舍五入为 109.319300。

这是两个矩阵:

> testFt
          [,1]    [,2]       [,3]
 [1,] 353367.5 1228429   0.000000
 [2,] 353363.2 1228428   4.332678
 [3,] 353359.3 1228433  10.712694
 [4,] 353356.0 1228438  16.029563
 [5,] 353358.1 1228451  29.364214
 [6,] 353366.3 1228469  49.616436
 [7,] 353383.1 1228461  68.395384
 [8,] 353382.9 1228443  86.336387
 [9,] 353374.4 1228429 102.443063
[10,] 353367.5 1228429 109.319272
> st_coordinates(helperTest)
             X       Y          M L1
 [1,] 353367.5 1228429   0.000000  1
 [2,] 353363.2 1228428   4.332678  1
 [3,] 353359.3 1228433  10.712690  1
 [4,] 353356.0 1228438  16.029560  1
 [5,] 353358.1 1228451  29.364210  1
 [6,] 353366.3 1228469  49.616440  1
 [7,] 353383.1 1228461  68.395380  1
 [8,] 353382.9 1228443  86.336390  1
 [9,] 353374.4 1228429 102.443100  1
[10,] 353367.5 1228429 109.319300  1

第一个矩阵具有正确的精度。第二个矩阵是使用 st_linestring 将第一个矩阵转换为线串的结果。然后,我将线串转换为 sf 对象,以便使用 st_coordinates 轻松显示矩阵,但是,如果您只是打印线串,您可以看到第三列中的值是四舍五入的。有没有办法设置 st_linestring 的精度,这样我的值就会像第一个矩阵一样有 6 位小数?

【问题讨论】:

  • 我无法复制这个。创建 XYM 线串并通过 st_coordinates 转换回来的测试对我来说不会失去任何精度。从testFthelperTest 的代码是什么?
  • @Spacedman 您可以看到使用 st_linestring 简单地将 testFt 转换为线串导致精度损失。 testFt <- st_linestring(testFt, dim = "XYM") 然后简单地调用testFt 将打印出线串并且可以看到精度损失。 LINESTRING M (353367.5 1228429 0, 353363.2 1228428 4.332678, 353359.3 1228433 10.71269, 353356 1228438 16.02956, 353358.1 1228451 29.36421, 353366.3 1228469 49.61644, 353383.1 1228461 68.39538, 353382.9 1228443 86.33639, 353374.4 1228429 102.4431, 353367.5 1228429 109.3193)

标签: r sf


【解决方案1】:

使用一些测试数据我无法复制。

制作一个 3x10 矩阵:

> testFt = matrix(runif(30),ncol=3)
> testFt
            [,1]      [,2]       [,3]
 [1,] 0.89427444 0.9614064 0.03305242
 [2,] 0.64785749 0.2379120 0.76285818
 [3,] 0.18872965 0.3535477 0.19718624
 [4,] 0.21516340 0.4436407 0.36707556
 [5,] 0.85731714 0.4872524 0.46147387
 [6,] 0.98970232 0.6678123 0.76021971
 [7,] 0.16932569 0.1547750 0.16983325
 [8,] 0.18255042 0.7313963 0.60732292
 [9,] 0.03580905 0.4369531 0.32653902
[10,] 0.21047936 0.4164918 0.40285367

转换为 LINESTRING:

> testFtPts = st_linestring(testFt, dim="XYM")

> testFtPts
LINESTRING M (0.8942744 0.9614064 0.03305242, 0.6478575 0.237912 0.7628582, 0.1887296 0.3535477 0.1971862, 0.2151634 0.4436407 0.3670756, 0.8573171 0.4872524 0.4614739, 0.9897023 0.6678123 0.7602197, 0.1693257 0.154775 0.1698332, 0.1825504 0.7313963 0.6073229, 0.03580905 0.4369531 0.326539, 0.2104794 0.4164918 0.4028537)

任何明显的精度损失都是由于显示截断而不是值的实际舍入。如果我转换为坐标:

> testFtPtsCoord = st_coordinates(testFtPts)
> testFtPtsCoord
               X         Y          M L1
 [1,] 0.89427444 0.9614064 0.03305242  1
 [2,] 0.64785749 0.2379120 0.76285818  1
 [3,] 0.18872965 0.3535477 0.19718624  1
 [4,] 0.21516340 0.4436407 0.36707556  1
 [5,] 0.85731714 0.4872524 0.46147387  1
 [6,] 0.98970232 0.6678123 0.76021971  1
 [7,] 0.16932569 0.1547750 0.16983325  1
 [8,] 0.18255042 0.7313963 0.60732292  1
 [9,] 0.03580905 0.4369531 0.32653902  1
[10,] 0.21047936 0.4164918 0.40285367  1

这些值都是相同的:

> all(testFt == testFtPtsCoord[,1:3])
[1] TRUE

我什至用与您的数据大致相同范围内的数字进行了尝试:

> set.seed(99)
> testFt = cbind(runif(10,353300,353400),runif(10,1228400, 1228500), runif(10, 0, 100))
> testFt
          [,1]    [,2]       [,3]
 [1,] 353358.5 1228455 22.7903474
 [2,] 353311.4 1228451  8.0524150
 [3,] 353368.4 1228419 82.1618422
 [4,] 353399.3 1228464 59.1113977
 [5,] 353353.5 1228469 77.3389019
 [6,] 353396.7 1228464 35.0085977
 [7,] 353367.1 1228436  0.6061323
 [8,] 353329.5 1228410 81.4506223
 [9,] 353335.8 1228410  0.1179229
[10,] 353317.5 1228418 20.0690183

> testFtPts = st_linestring(testFt, dim="XYM")
> testFtPtsCoord = st_coordinates(testFtPts)
> all(testFt == testFtPtsCoord[,1:3])
[1] TRUE
> 

假设这是您从矩阵到线再到矩阵的方式,我无法复制任何精度损失。

【讨论】:

  • 感谢您的解释。现在更有意义的是, st_linestring 明显的精度损失只是显示截断。当我尝试将线串转换回 sf 对象时,这些值必须实际上已经四舍五入。
猜你喜欢
  • 1970-01-01
  • 2018-08-17
  • 2022-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
相关资源
最近更新 更多