如何为大量 lat/long 坐标绘制多边形并计算表面面积?
How to draw Polygon for lots of lat/long coordinates and calculate surface are?
我有以下数据:https://ufile.io/p9s0le6g
...由 485 lat/long 个观察值组成。我最终想计算这个数字的表面积(以 m2 或 km2 为单位)。我想用数据点(外点)创建一个多边形,然后计算表面。但是,我想不出一个漂亮的多边形。
我作为坐标的数据点如下所示:
我想要一个看起来像那样(或类似)的多边形:
这是我尝试过的:
library(sp)
df <- read.csv('data.csv')
p = Polygon(df)
ps = Polygons(list(p),1)
sps = SpatialPolygons(list(ps))
plot(sps)
这导致(显然不是一个很好的多边形):
我也尝试实现 Create polygon from set of points distributed 的答案,但这对我来说只是一个矩形:
任何人都知道如何优化我的多边形以获得看起来像我的数据点外部形状的图形,以及如何计算该优化多边形的表面?
使用 concaveman
和 sf
我们可以在您的点集周围创建一个凹包:
library(sf)
library(concaveman)
pts <- st_as_sf(df, coords=c('LONG','LAT'), crs=4326 )
conc <- concaveman(pts)
conc %>% st_area()
# 4010443 [m^2]
library(ggplot2)
ggplot() +
geom_sf(data=pts, col = 'red', pch=3) +
geom_sf(data = conc, fill = NA)
考虑使用优秀的 {sf} 包中的函数而不是旧的 {sp}。
比如这个例子,建立在sf::st_convex_hull
library(sf)
library(tidyverse)
points <- read_csv("data.csv") %>%
st_as_sf(coords = c("LONG","LAT"), crs=4326)
polygon <- st_union(points) %>% # unite the points to 1 object
st_convex_hull() # calculate the convex hull
# verify the results by drawing a map
ggplot() +
geom_sf(data = points, col = "red", size = 2, pch = 4) +
geom_sf(data = polygon, col = "grey45", fill = NA)
# as a bonus: area of the polygon
area <- st_area(polygon)
area
我有以下数据:https://ufile.io/p9s0le6g
...由 485 lat/long 个观察值组成。我最终想计算这个数字的表面积(以 m2 或 km2 为单位)。我想用数据点(外点)创建一个多边形,然后计算表面。但是,我想不出一个漂亮的多边形。
我作为坐标的数据点如下所示:
我想要一个看起来像那样(或类似)的多边形:
library(sp)
df <- read.csv('data.csv')
p = Polygon(df)
ps = Polygons(list(p),1)
sps = SpatialPolygons(list(ps))
plot(sps)
这导致(显然不是一个很好的多边形):
任何人都知道如何优化我的多边形以获得看起来像我的数据点外部形状的图形,以及如何计算该优化多边形的表面?
使用 concaveman
和 sf
我们可以在您的点集周围创建一个凹包:
library(sf)
library(concaveman)
pts <- st_as_sf(df, coords=c('LONG','LAT'), crs=4326 )
conc <- concaveman(pts)
conc %>% st_area()
# 4010443 [m^2]
library(ggplot2)
ggplot() +
geom_sf(data=pts, col = 'red', pch=3) +
geom_sf(data = conc, fill = NA)
考虑使用优秀的 {sf} 包中的函数而不是旧的 {sp}。
比如这个例子,建立在sf::st_convex_hull
library(sf)
library(tidyverse)
points <- read_csv("data.csv") %>%
st_as_sf(coords = c("LONG","LAT"), crs=4326)
polygon <- st_union(points) %>% # unite the points to 1 object
st_convex_hull() # calculate the convex hull
# verify the results by drawing a map
ggplot() +
geom_sf(data = points, col = "red", size = 2, pch = 4) +
geom_sf(data = polygon, col = "grey45", fill = NA)
# as a bonus: area of the polygon
area <- st_area(polygon)
area