2016-08-18 7 views
3

Я пытаюсь использовать модифицированную версию кода R, найденный в следующей ссылке:Неправильного возвращение NA при преобразовании Lat/Long Координаты на место в R

Latitude Longitude Coordinates to State Code in R

Чтобы проверить код, я создал следующие формальные аргументы:

mapping = "state" 
pointsDF = data.frame(x = c(-88.04607, -83.03579), y = c(42.06907, 42.32983)) 
latlong2state(pointsDF, mapping) 

код возвращается следующее:

[1] "Illinois" NA 

Первый набор координат возвращает правильный ответ, то есть «Иллинойс». Однако, когда я ввести второй набор координат (т.е. -83,03579, 42,32983) в онлайн-конвертер, я получаю следующее:

Downtown, Detroit, MI, USA 

(http://www.latlong.net/Show-Latitude-Longitude.html)

Выполнение кода еще раз, но меняя второй координаты от 42.32983 до 43.33 ставит точку в штате Мичиган.

При использовании «мировой» карты в качестве моего официального аргумента для переменной «mapping» код возвращает «USA». Я много дней боролся за то, чтобы понять это и не повезло. Я играл с SpatialPointDataFrames, различными проекциями и изучал сами объекты полигона. Я использую R версии 3.3.1 в системе Windows 7. Я думаю, что данный пункт данных может падать на границе. В этом случае, я думаю, ожидается «НС». Код, который я использовал, приведен ниже.

Код Использована

library(sp) 

library(maps) 
library(maptools) 
library(rgdal) 

latlong2state = function(pointsDF, mapping) { 

     local.map = map(database = mapping, fill = TRUE, col = "transparent", plot = FALSE) 
     IDs = sapply(strsplit(local.map$names, ":"), function(x) x[1]) 
     maps_sp = map2SpatialPolygons(map = local.map, ID = IDs, 
             proj4string = CRS("+proj=longlat +datum=WGS84"))       
     pointsSP = SpatialPoints(pointsDF, 
           proj4string = CRS("+proj=longlat +datum=WGS84")) 
     indices = over(x = pointsSP, y = maps_sp) 
     mapNames = sapply([email protected], function(x) {[email protected]}) 
     mapNames[indices] 
} 

Я всего два месяца для обучения R и любить язык до сих пор. Это был первый раз, когда я не мог найти ответа. Я бы очень признателен за помощь, оказанную по этому вопросу !!!

ответ

3

Во-первых, проблема не из-за точки, лежащей на границе. Фактически, over() не вернет NA для точки на границе, а скорее «если точка попадает в несколько полигонов, записывается последний многоугольник».

NA обозначает точку, которая не попадает в многоугольник. Мы можем увеличить на карте, чтобы увидеть это тот случай,

plot(local.map, xlim = c(-83.2, -82.8), ylim=c(42.2,42.6), type="l") 
polygon(local.map, col="grey60") 
points(local.map) 
points(pointsDF[2,], col="red") 

enter image description here

точка выходит за прилежащие США в Канаде, в соответствии с полигонами, предусмотренных maps::map(). Почему это будет так, когда другие карты, как вы говорите, найдете этот пункт на стороне США границы? Я не думаю, что это проблема проектирования, потому что мы используем те же географические координаты WGS84 для полигонов и точек. Поэтому представляется, что сами полигоны, которые предоставляются maps::map(), могут быть неправильными.

Мы можем проверить это по сравнению с многоугольниками из другого источника. Я загрузил штаты переписи США в США с максимальным разрешением с http://www2.census.gov/geo/tiger/GENZ2015/shp/cb_2015_us_state_500k.zip.Затем

shp.path <- "C:/Users/xxx/Downloads/cb_2015_us_state_500k/cb_2015_us_state_500k.shp" 
states <- readOGR(path.expand(shp.path), "cb_2015_us_state_500k") 
plot(states, xlim = c(-83.2, -82.8), ylim=c(42.2,42.6)) 
points(pointsDF[2,], col="red") 

получает нас эту карту, в которой мы видим, что точка находится внутри США границы:

enter image description here

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

+0

Спасибо! Карта с высоким разрешением разрешила примерно дополнительные 1000 пар координат. Тем не менее, еще есть еще несколько, которые находятся в пределах США и не разрешаются (например, Широта: 25,72, Долгота: -80,23, Майами, штат Флорида). Я не мог найти карту более высокого разрешения для состояний. Я использовал новый шейп-файл для мира и смог разрешить дополнительные координаты, но только для страны, а не для отдельного государства. Можно ли добавить координаты lat/long в шейп-файл? –

+0

Также вы знаете, как разрешить местоположение из списка IP-адресов? Я видел несколько способов решения небольших партий, но меня интересует как минимум 100 000 IP-адресов за раз. Я просмотрел пакет freegeoip, RDSTK и базу данных Maxmind и не смог сделать это в таких больших масштабах. –

+0

@DanA. если вышеуказанные данные все еще недостаточно хороши, вы можете попробовать https://www.census.gov/cgi-bin/geo/shapefiles/index.php. Я не знаю других улучшенных шейп-файлов. У меня нет опыта в решении IP-адресов для координат. Возможно, вам нужно задать вопрос в качестве нового вопроса, если вы не можете найти ответ с помощью веб-поиска. – dww