我想从 shapefile 中获取纬度和经度。到目前为止,我只知道如何读取 shapefile。
library(rgdal)
centroids.mp <- readOGR(".","35DSE250GC_SIR")
但是我如何从 centroids.mp 中提取纬度和经度?
这个问题有几个层次。
您要求提供经度和纬度,但这可能不是该对象使用的坐标系。你可以得到这样的坐标
coordinates(centroids.mp)
请注意,如果这是 SpatialPointsDataFrame,“质心”将是所有坐标,如果这是 SpatialLinesDataFrame,则将是所有线坐标的列表,如果这是 SpatialPolygonsDataFrame,则只是质心。
坐标可能是经度和纬度,但对象可能不知道。利用
proj4string(centroids.mp)
如果那是“NA”,那么对象不知道 (A)。如果它包含“+proj=longlat”,则该对象确实知道并且它们是经度/纬度 (B)。如果它包含“+proj=”和其他名称(不是“longlat”),那么该对象确实知道并且它不是经度/纬度 (C)。
如果(A)您必须找出答案,或者从值中可以明显看出。
如果(B)你完成了(虽然你应该先检查假设,这些元数据可能不正确)。
如果(C)你可以(非常可靠,尽管你应该首先检查假设)转换为经度纬度(在基准 WGS84 上),如下所示:
coordinates(spTransform(centroids.mp, CRS("+proj=longlat +datum=WGS84")))
使用coordinates()
,像这样:
library(maptools)
xx <- readShapePoints(system.file("shapes/baltim.shp", package="maptools")[1])
coordinates(xx)
# coords.x1 coords.x2
# 0 907.0 534.0
# 1 922.0 574.0
# 2 920.0 581.0
# 3 923.0 578.0
# 4 918.0 574.0
# [.......]
st_coordinates
解决了这个问题,但是它从 sf 对象中删除了与坐标相关的协变量。如果您需要它们,我在这里分享一个替代方案:
# useful enough
sites_sf %>%
st_coordinates()
#> X Y
#> 1 -80.14401 26.47901
#> 2 -80.10900 26.83000
# alternative to keep covariates within a tibble/sf
sites_sf %>%
st_coordinates_tidy()
#> Joining, by = "rowname"
#> Simple feature collection with 2 features and 3 fields
#> geometry type: POINT
#> dimension: XY
#> bbox: xmin: -80.14401 ymin: 26.479 xmax: -80.109 ymax: 26.83
#> epsg (SRID): 4326
#> proj4string: +proj=longlat +datum=WGS84 +no_defs
#> # A tibble: 2 x 4
#> gpx_point X Y geometry
#> <chr> <dbl> <dbl> <POINT [°]>
#> 1 a -80.1 26.5 (-80.14401 26.47901)
#> 2 b -80.1 26.8 (-80.109 26.83)