Поиск различий в проекциях в R и проекциях в ArcMap

Моя текущая проблема заключается в создании программы или функции R, которая создает проекцию кадра данных из точек широты и долготы в данные NAD-1983 2011 StatePlane Pennsylvania South FIPS - 3702. В настоящее время я попал в ловушку. Вот входные данные, которые я использовал:

Широта Долгота:

-75.35843   40.12232
-75.36189   40.12347
-75.36404   40.12456
-75.37228   40.1287
-75.37835   40.13243
-75.38479   40.13835
-75.38961   40.14198
-75.39536   40.14724
-75.40018   40.15457
-75.40614   40.15849
-75.40939   40.16014
-75.41906   40.16572
-75.43034   40.17133
-75.43579   40.17576

Текущая функция, которую я пробовал, использует функции rgdal и sf. Я пытаюсь сделать следующее:

  • Определите проекцию данных data_x в широте/долготе
  • Спроецируйте данные в NAD-1983 2011 StatePlane Pennsylvania South FIPS — данные 3702

Информация о StatePlane ниже:

NAD_1983_2011_StatePlane_Pennsylvania_South_FIPS_3702
WKID: 6564 Authority: EPSG

Projection: Lambert_Conformal_Conic
False_Easting: 600000.0
False_Northing: 0.0
Central_Meridian: -77.75
Standard_Parallel_1: 39.93333333333333
Standard_Parallel_2: 40.96666666666667
Latitude_Of_Origin: 39.33333333333334
Linear Unit: Meter (1.0)

Geographic Coordinate System: GCS_NAD_1983_2011
Angular Unit: Degree (0.0174532925199433)
Prime Meridian: Greenwich (0.0)
Datum: D_NAD_1983_2011
      Spheroid: GRS_1980
            Semimajor Axis: 6378137.0
            Semiminor Axis: 6356752.314140356
            Inverse Flattening: 298.257222101

И вот код, который я придумал

pckgs <- c("rgdal", "sf")
install.packages(pckgs)
library(rgdal)
library(sf)

project_coordinates <- function(df = "data_x", x = "Long", y = "Lat"){
      # returns a dataframe with two new columns containing projected coordinates to NAD83
      ## df(str): dataframe to use
      ## x (str): name of column containing Longitude in degrees
      ## y (str): name of column containing Latitude in degrees
  df <- st_set_crs(df, "+proj=longlat +ellps=GRS80 +datum=NAD83")
  proj <- "+lat_1=39.93333333333333 +lat_2=40.96666666666667 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0= 600000.0 +y_0=0 +k_0=lcc +ellps=GRS80 +datum=NAD83 +units=m no_defs"
  lat_long_proj <- project(as.matrix(cbind(df[x],df[y])),proj)
  df["Long_proj"] <-lat_long_proj[,1]
  df["Lat_proj"] <- lat_long_proj[,2]
  return(df)
}

Вот пример некоторых результатов того, что я нашел.

От Р:

2637234.459 296472.2704
2636255.877 296864.8632
2635644.121 297245.5394
2633300.071 298690.992
2631566.848 300003.65
2629709.03  302111.1583
2628326.55  303396.9907
2626668.485 305269.5429
2625250.476 307902.9271
2623547.213 309286.1584
2622623.208 309862.9293
2619867.744 311823.4605
2616662.666 313783.4043
2615097.884 315356.6863

И из ArcGIS:

103492.4449 778962.9451
103492.4652 778963.7957
103492.4652 778963.7957
103728.4336 778891.792
103785.0208 778469.1788
103675.0824 778236.0495
104262.4265 777852.7858
104271.2263 777849.1735
104276.7765 777849.042
104276.8168 777850.743
104277.9268 777850.7168
104279.057  777851.541
104279.057  777851.541
104280.1671 777851.5147

Хотя я не сталкивался с какими-либо ошибками взлома кода, эти результаты являются непостоянным фактором расстояния друг от друга. Есть ли пакет, который мне не хватает? Я пропустил команду или шаг?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
118
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У AM возникли проблемы с запуском вашего кода, потому что, если я передам фрейм данных, он выдаст ошибку

Error in UseMethod("st_crs<-") : 
  no applicable method for 'st_crs<-' applied to an object of class "data.frame"
>

Я думаю, вы должны каким-то образом считывать его во фрейм пространственных данных. Также ваша целевая проекционная строка кажется сломанной. Я покажу вам, как я это сделаю:

Во-первых, с данными в текстовом файле, подобном этому (который имеет длинную ширину):

-75.35843   40.12232
-75.36189   40.12347
-75.36404   40.12456
-75.37228   40.1287

Я бы прочитал это с:

> pts = read.table("latlong.txt",head=FALSE)
> head(pts)
         V1       V2
1 -75.35843 40.12232
2 -75.36189 40.12347
3 -75.36404 40.12456
4 -75.37228 40.12870
5 -75.37835 40.13243
6 -75.38479 40.13835

Затем используйте функции пакета sf, чтобы преобразовать его в точки с системой координат EPSG:4326 — общие координаты GPS:

> pts2 = st_as_sf(pts, coords=c(1,2), crs=4326)
> pts2
Simple feature collection with 14 features and 0 fields
geometry type:  POINT
dimension:      XY
bbox:           xmin: -75.43579 ymin: 40.12232 xmax: -75.35843 ymax: 40.17576
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs
First 10 features:
                     geometry
1  POINT (-75.35843 40.12232)
2  POINT (-75.36189 40.12347)
3  POINT (-75.36404 40.12456)
4   POINT (-75.37228 40.1287)
5  POINT (-75.37835 40.13243)
6  POINT (-75.38479 40.13835)
7  POINT (-75.38961 40.14198)
8  POINT (-75.39536 40.14724)
9  POINT (-75.40018 40.15457)
10 POINT (-75.40614 40.15849)

Теперь я могу перейти в любую другую систему координат. Ваша цель выглядит как EPSG: 6564 (WKID: 6564 Authority: EPSG) (http://epsg.io/6564), хотя вы также упоминаете 3702, что, похоже, связано с Вайомингом...).

> st_transform(pts2, 6564)
Simple feature collection with 14 features and 0 fields
geometry type:  POINT
dimension:      XY
bbox:           xmin: 797083.4 ymin: 90364.93 xmax: 803830.7 ymax: 96120.91
epsg (SRID):    6564
proj4string:    +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs
First 10 features:
                    geometry
1  POINT (803830.7 90364.93)
2  POINT (803532.4 90484.59)
3  POINT (803345.9 90600.62)
4   POINT (802631.5 91041.2)
5   POINT (802103.2 91441.3)
6  POINT (801536.9 92083.67)
7  POINT (801115.5 92475.59)
8  POINT (800610.2 93046.34)
9     POINT (800177.9 93849)
10 POINT (799658.8 94270.61)
> 

и эти точки не совпадают с теми, которые вы указали ни для вашего R-кода, ни для ARCGis, если предположить, что указанные вами значения широты и долготы должны соответствовать преобразованным координатам XY, которые вы дали.

Я был бы очень уверен в том, что числа, которые я дал выше, являются координатами EPSG: 6564 координат EPSG: 4326 широты и долготы в источнике.

Также мне удалось исправить сломанную строку проекции:

proj <- "+lat_1=39.93333333333333 +lat_2=40.96666666666667 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000.0 +y_0=0 +proj=lcc +ellps=GRS80 +datum=NAD83 +units=m"

и это дает те же результаты, что и EPSG:6564.

Не имея возможности запустить ваш код и воспроизвести ваши результаты, я не уверен, в чем проблема, но мой код - это то, как я это сделаю, и я вполне уверен, что это правильно.

Другие вопросы по теме