【问题标题】:How to convert X and Y coordinates into Latitude and longitude?如何将X和Y坐标转换为纬度和经度?
【发布时间】:2020-03-29 16:34:26
【问题描述】:

以下是我从圣路易斯公开可用的犯罪数据集中获得的数据框示例。与数据相关的文档指出 Xcoord 和 Ycoord 位于 State Plane North American Datum 1983 (NAD83) 格式

   CodedMonth                                    Description   XCoord    YCoord
1:    2019-09        AUTO THEFT-PERM RETNT/UNRECOV OVER 48HR 908297.3 1018623.0
2:    2019-09        ASSLT-AGGRAV-OTH-WPN-2ND-CHILD-DOMESTIC 903995.7 1014255.0
3:    2019-09 FORGERY-ISSUING FALSE INSTRUMENT OR CERTIFICAT      0.0       0.0
4:    2019-09           STLG BY DECEIT/IDENTITY THEFT REPORT 890704.7 1010659.0
5:    2019-09          STALKING (HARASSMENT ONLY, NO THREAT) 881105.8 1008297.0
6:    2019-09               LARCENY-MTR VEH PARTS UNDER $500 882929.6  992941.3

如何将这些转换为 XcoordYcoord 列到 lon 和 lat 格式,以便我可以使用 ggmap 进行绘制

我找到了几个答案Convert latitude/longitude to state plane coordinates

但我似乎无法让它为我的数据工作

【问题讨论】:

    标签: r geospatial ggmap


    【解决方案1】:

    您可以使用 sf 包将其转换为简单的要素地理。
    为了使它工作,您需要知道您正在使用什么坐标系,并根据您提供的描述(国家平面 NAD83 并且在圣路易斯附近),我的第一个猜测是 EPSG 26996(NAD83 / 密苏里东部 USFT ),但那是在休伦湖中间绘制的,所以我尝试了 ESRI:102696。您可以在 spatialreference.org 查找预测。

    library(sf)
    library(tidyverse)
    library(ggmap)
    
    my_df <- read_csv("C:/Users/Brian/Documents/temp.csv")
    my_sf_df <- st_as_sf(my_df, coords = c("XCoord", "YCoord"), crs = 102696) 
    
    

    这会将 x 和 y 设置为空间坐标。您需要重新投影到 WGS84 等地理系统中才能转换为经纬度。 st_transform 为我们使用 crs = 4326,这是 WGS 84 坐标系

    
    my_latlon_df <- st_transform(my_sf_df, crs = 4326 ) 
    my_latlon_df <- my_latlon_df%>%
          mutate( lat= st_coordinates(my_latlon_df)[,1],
                  lon = st_coordinates(my_latlon_df)[,2])
    my_latlon_df
    
    # Simple feature collection with 6 features and 5 fields
    # geometry type:  POINT
    # dimension:      XY
    # bbox:           xmin: -93.26566 ymin: 35.80151 xmax: -90.19163 ymax: 38.63065
    # epsg (SRID):    4326
    # proj4string:    +proj=longlat +datum=WGS84 +no_defs
    # # A tibble: 6 x 6
    # X1    CodedMonth Description                                                geometry   lat   lon
    # * <chr> <chr>      <chr>                                                   <POINT [°]> <dbl> <dbl>
    #       1 1:    2019-09    AUTO THEFT-PERM RETNT/UNRECOV OVER 48HR        (-90.19163 38.63065) -82.2  44.7
    # 2 2:    2019-09    ASSLT-AGGRAV-OTH-WPN-2ND-CHILD-DOMESTIC         (-90.20674 38.6187) -82.3  44.7
    # 3 3:    2019-09    FORGERY-ISSUING FALSE INSTRUMENT OR CERTIFICAT (-93.26566 35.80151) -93.3  35.8
    # 4 4:    2019-09    STLG BY DECEIT/IDENTITY THEFT REPORT           (-90.25329 38.60893) -82.4  44.6
    # 5 5:    2019-09    STALKING (HARASSMENT ONLY, NO THREAT)           (-90.2869 38.60251) -82.5  44.6
    # 6 6:    2019-09    LARCENY-MTR VEH PARTS UNDER $500               (-90.28065 38.56034) -82.5  44.5
    
    

    现在,我们的数据框中的列是纬度和经度的地理坐标。没有位置信息会导致问题,因为它将绘制在州平面坐标平面的原点,该坐标平面位于阿肯色州的某个地方。让我们删除它,以便我们可以专注于优点

    # let's exclude point 3 for now
    my_latlon_df <- my_latlon_df[-3,]
    box <- st_bbox(my_latlon_df) # bounding box
    names(box) <- NULL # removing non-complient labels
    buffer = .2
    box2 <- box + c(-buffer, -buffer, buffer, buffer) # buffering
    base_map <- get_map(location = box2, source = "osm")  # getting base map
    # plotting
    ggmap(base_map)+
          geom_sf(data = my_latlon_df,
                  color = "red",
                  size = 2
                  )+
          scale_x_continuous(limits = c(-90.35, -90.1))+
          scale_y_continuous(limits = c(38.5, 38.7))
    

    不幸的是,如果您不知道 x 点和 y 点所在的坐标系,这可能会成为令人沮丧的试错游戏。投影坐标系基本上在地球表面上创建一个笛卡尔平面,并且原点、比例和其他参数的选择是特定于每个投影的。地理坐标系(如 WGS84)几乎没有太大差异。

    【讨论】:

      【解决方案2】:

      正确的地理系统/投影是“ESRI:102696”,因此代码应为:

      my_sf_df <- st_as_sf(my_df, coords = c("XCoord", "YCoord"), crs = "ESRI:102696" ) 
      

      【讨论】:

        猜你喜欢
        • 2016-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-05
        • 2020-07-04
        相关资源
        最近更新 更多