Я использую данные о широте и долготе и пытаюсь графически отобразить метрики в каждой точке карты Стокгольма (в зависимости от близости к этой точке). Меня больше интересует, чтобы точки были равномерно разнесены на изображении, а не одинаково разнесены по фактическому расстоянию: в этом смысле я понимаю, что расстояния между точками широты на экваторе больше, чем они вдоль полярных кругов, и это может быть решающий вопрос.
Моя цель состояла в том, чтобы разделить карту на сетку с шагом примерно 1 км по осям x и y. Таким образом, я взял минимальную и максимальную широту и долготу, вычислил их расстояния x и y от центра Стокгольма, а затем разделил диапазон широты и долготы на диапазон координат x и y (с использованием геосферы). Я сделал это, потому что хотел, чтобы точки были равномерно распределены при их построении (в противном случае расстояние между x точками вверху по сравнению с нижней частью карты было бы меньше из-за близости к экватору).
Затем я нанес эти точки на карту (с помощью ggmap) и заметил, что расстояние между точками в направлении y больше, чем в направлении x. Я полагаю, что карту можно было бы просто нарисовать в искаженном виде, но это кажется слишком искаженным, чтобы в это поверить. Я подозреваю, что делаю что-то не так, но не могу найти, что это может быть.
Пример кода ниже:
library("ggmap")
library("RgoogleMaps")
library("geosphere")
stockholm <- get_map("stockholm", zoom=11)
ggmap(stockholm)
places <- c('Tensta', 'Hanviken')
pos <- data.frame(Places = places, lat = NA, lon = NA, x = NA, y = NA)
reflatlon = getGeoCode('Stockholm, Sweden')
for(i in 1:length(places)) {
latlon <- getGeoCode(paste0(places[i], ', Stockholm'))
pos$lat[i] <- as.numeric(latlon[1])
pos$lon[i] <- as.numeric(latlon[2])
dist_y <- distGeo(c(latlon[1], reflatlon[2]), reflatlon) * sign(latlon[1] - reflatlon[1]) # same longitude
dist_x <- distGeo(c(reflatlon[1], latlon[2]), reflatlon) * sign(latlon[2] - reflatlon[2]) # same latitude
pos$x[i] <- dist_x
pos$y[i] <- dist_y
}
deglatperm <- ( max(pos$lat) - min(pos$lat) ) / ( max(pos$y) - min(pos$y) ) # degrees latitude per metre
deglonperm <- ( max(pos$lon) - min(pos$lon) ) / ( max(pos$x) - min(pos$x) ) # degrees longitude per metre
seqlat <- seq(min(pos$lat), max(pos$lat), by = deglatperm*1000) # sequence with a point every ~1km
seqlon <- seq(min(pos$lon), max(pos$lon), by = deglonperm*1000) # sequence with a point every ~1km
seqlatlon <- expand.grid(seqlat, seqlon)
names(seqlatlon) <- c('lat', 'lon')
ggmap(stockholm) + geom_point(aes(x = lon, y = lat), data=seqlatlon)
Как видно из выходного графика, расстояние между точками в направлении y по крайней мере в два раза больше, чем в направлении x.
Подводя итог: координаты x и y получены с использованием геосферы. Карта построена с использованием ggmap.
Я что-то не так делаю с геосферой? Или карты широты и долготы SO искажены? Когда я открываю Карты Google и использую инструмент «измерить расстояние» примерно между верхней и нижней, а также левой и правой точками, я получаю оценки в 16,3 и 16,9 км, тогда как значения, которые я получаю с геосферой, составляют 17 и 32 км (x и y ) соответственно.
Если бы кто-нибудь мог сказать мне, что здесь происходит, я был бы чрезвычайно благодарен!