Преобразование географического формата в R - Центральная широта / долгота плюс смещение метра на большой площади - PullRequest
0 голосов
/ 05 февраля 2019

Я работаю с набором данных граничных файлов FSA, предоставленных Статистическим управлением Канады. Данные и полные сведения доступны здесь, набор 2016 г.

Чтобы данные были совместимы с остальной частью того, над чем я работаю, мне нужно преобразовать из предоставленного формата в широты / долготы.

Подробности предоставленного формата:

  • Проекция: конформный конус Ламберта
  • Ложное восточное направление: 6200000.000000
  • Ложное северное направление: 3000000.000000
  • Центральный меридиан: -91.866667
  • Стандартная параллель 1: 49.000000
  • Стандартная параллель 2: 77.000000
  • Широта происхождения: 63.390675
  • Линейная единица: метр (1.000000)
  • Базовая: Североамериканская 1983 (NAD83)
  • Первичный меридиан: Гринвич
  • Угловая единица: градус
  • Сфероид: GRS 1980

Я использую rgeos :: gCentroid для получения центроида каждого FSA, поэтому в решении не нужно принимать во внимание объекты sf или sp.

Все FSA, представляющие наибольший интерес, - вседовольно далеко от центра широты / долготы 63,390674, -91,8666667, поэтому приближения, подходящие для коротких расстояний, не работают для меня.

Из решения, детализированного здесь Я адаптировал следующий код:

# Read Shape File
fsa <- sf::st_read('~/lfsa000b16a_e.shp')

# Compute Centroid per FSA and store in dataframe
fsa_centroids = gCentroid(as(fsa, 'Spatial'), byid = TRUE, id = fsa$CFSAUID)
fsa_df <- data.frame(fsa_centroids)
fsa_df['fsa'] = rownames(fsa_df)

# Earth Radius
R = 6371007.1810

# Central Lat/Lon
lat0 = 63.390675
lon0 = -91.866667

# Remove false Easting/Northing
fsa_df$x = fsa_df$x - 6200000
fsa_df$y = fsa_df$y - 3000000

# Sphere-approximation calculations
fsa_df$lat = asin(sin(lat0*pi/180)*cos(fsa_df$y/R) + cos(lat0*pi/180)*sin(fsa_df$y/R)*cos(0)) * 180/pi
fsa_df$lon = lon0 + atan2(sin(pi/2)*sin(fsa_df$x/R*cos(fsa_df$lat*pi/180)), cos(fsa_df$x/R)-sin(fsa_df$lat*pi/180)^2) * 180/pi

(извиненияс такими бессмысленными терминами, как cos(0), я хотел сохранить полную формулу и я был неуверен, какой подшипник был 0 рад, поэтому я возился)

Моя проблема двоякая: это решение основано на совершенной сфереПредположение и данные использует сфероид GRS 1980.Кроме того, поскольку мы пересекаем сфероид, имеет значение порядок, в котором вы идете на восток / запад и север / юг (хотя оба порядка имеют очень высокие ошибки в приближенном решении).

Есть ли более простой способ или библиотекиЯ могу использовать это преобразование?

...