我想從 R 中的空間物件中提取測量單位(十進制度數、米、英尺等)。例如,如果我有一個使用 WGS84 坐標參考系統 (EPSG:4326) 的 SF 資料框),我希望能夠確定坐標是以十進制度數指定的。同樣,我希望能夠確定以米為單位指定的 UTM 坐標(例如 EPSG:32615)。
我嘗試使用包中的st_crs()函式sf,它以眾所周知的文本格式回傳坐標參考系統。但是,我正在努力確定從那個眾所周知的文本中提取測量單位的正則運算式將在廣泛的坐標系統中可靠地運行。
是否有回傳空間物件測量單位的現有函式?
例如,以下代碼生成一個使用 WGS84 坐標系的 SF 資料框:
library(sf)
#> Linking to GEOS 3.8.1, GDAL 3.2.1, PROJ 7.2.1
cities <- st_sf(city = "London", geometry = st_sfc(st_point(c(-0.1276, 51.5072))), crs = 4326)
cities
#> Simple feature collection with 1 feature and 1 field
#> Geometry type: POINT
#> Dimension: XY
#> Bounding box: xmin: -0.1276 ymin: 51.5072 xmax: -0.1276 ymax: 51.5072
#> Geodetic CRS: WGS 84
#> city geometry
#> 1 London POINT (-0.1276 51.5072)
由reprex 包(v2.0.1)于 2021 年 12 月 21 日創建
理想情況下,我正在尋找一個函式,該函式允許我確定該資料集的空間單位是十進制度數,例如,如果呼叫了該函式,st_crs_unit()我想呼叫st_crs_unit(cities)該函式并且該函式回傳該單位"degrees"或類似單位。
st_crs()以眾所周知的文本格式生成有關 CRS 的資訊,包括坐標系 ( CS[])ANGLEUNIT "degree"對兩個軸都使用有些系統適用于所有人。
st_crs(cities)
#> Coordinate Reference System:
#> User input: EPSG:4326
#> wkt:
#> GEOGCRS["WGS 84",
#> DATUM["World Geodetic System 1984",
#> ELLIPSOID["WGS 84",6378137,298.257223563,
#> LENGTHUNIT["metre",1]]],
#> PRIMEM["Greenwich",0,
#> ANGLEUNIT["degree",0.0174532925199433]],
#> CS[ellipsoidal,2],
#> AXIS["geodetic latitude (Lat)",north,
#> ORDER[1],
#> ANGLEUNIT["degree",0.0174532925199433]],
#> AXIS["geodetic longitude (Lon)",east,
#> ORDER[2],
#> ANGLEUNIT["degree",0.0174532925199433]],
#> USAGE[
#> SCOPE["Horizontal component of 3D system."],
#> AREA["World."],
#> BBOX[-90,-180,90,180]],
#> ID["EPSG",4326]]
由reprex 包(v2.0.1)于 2021 年 12 月 21 日創建
例如,如果我們將相同的資料轉換為使用 UTM zone 30N 坐標系,則輸出會st_crs()發生很大變化。
st_crs(st_transform(cities, crs = 32630))
#> Coordinate Reference System:
#> User input: EPSG:32630
#> wkt:
#> PROJCRS["WGS 84 / UTM zone 30N",
#> BASEGEOGCRS["WGS 84",
#> DATUM["World Geodetic System 1984",
#> ELLIPSOID["WGS 84",6378137,298.257223563,
#> LENGTHUNIT["metre",1]]],
#> PRIMEM["Greenwich",0,
#> ANGLEUNIT["degree",0.0174532925199433]],
#> ID["EPSG",4326]],
#> CONVERSION["UTM zone 30N",
#> METHOD["Transverse Mercator",
#> ID["EPSG",9807]],
#> PARAMETER["Latitude of natural origin",0,
#> ANGLEUNIT["degree",0.0174532925199433],
#> ID["EPSG",8801]],
#> PARAMETER["Longitude of natural origin",-3,
#> ANGLEUNIT["degree",0.0174532925199433],
#> ID["EPSG",8802]],
#> PARAMETER["Scale factor at natural origin",0.9996,
#> SCALEUNIT["unity",1],
#> ID["EPSG",8805]],
#> PARAMETER["False easting",500000,
#> LENGTHUNIT["metre",1],
#> ID["EPSG",8806]],
#> PARAMETER["False northing",0,
#> LENGTHUNIT["metre",1],
#> ID["EPSG",8807]]],
#> CS[Cartesian,2],
#> AXIS["(E)",east,
#> ORDER[1],
#> LENGTHUNIT["metre",1]],
#> AXIS["(N)",north,
#> ORDER[2],
#> LENGTHUNIT["metre",1]],
#> USAGE[
#> SCOPE["Engineering survey, topographic mapping."],
#> AREA["Between 6°W and 0°W, northern hemisphere between equator and 84°N, onshore and offshore. Algeria. Burkina Faso. C?te' Ivoire (Ivory Coast). Faroe Islands - offshore. France. Ghana. Gibraltar. Ireland - offshore Irish Sea. Mali. Mauritania. Morocco. Spain. United Kingdom (UK)."],
#> BBOX[0,-6,84,0]],
#> ID["EPSG",32630]]
由reprex 包(v2.0.1)于 2021 年 12 月 21 日創建
是否有現有的 R 函式可以回傳空間物件的測量單位?
uj5u.com熱心網友回復:
st_crs()有一個parameters引數,當 時回傳有用的 CRS 引數串列TRUE,包括 CRS 的單位。這是一個帶有內置nc資料的示例:
library(sf)
nc_4267 <- read_sf(system.file("shape/nc.shp", package="sf"))
nc_3857 <- st_transform(nc_4267, 3857)
st_crs(nc_4267, parameters = TRUE)$units_gdal
#> [1] "degree"
st_crs(nc_3857, parameters = TRUE)$units_gdal
#> [1] "metre"
請注意,對于某些目的st_is_longlat()可能就足夠了:
st_is_longlat(nc_4267)
#> [1] TRUE
st_is_longlat(nc_3857)
#> [1] FALSE
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/388789.html
下一篇:用R中定義的向量替換行名稱
