Как рассчитать расстояние между двумя ZIP-файлами?

У меня есть список почтовых индексов США, и мне нужно рассчитать расстояние между всеми точками почтовых индексов. Это длинный список из 6k ZIP, у каждого объекта есть ZIP, Город, Штат, Широта, Долгота, Площадь и Население.

Итак, я должен рассчитать расстояние между всеми точками, т.е. 6000C2 комбинаций.

Вот образец моих данных

Как рассчитать расстояние между двумя ZIP-файлами?

Я пробовал это в SAS, но он слишком медленный и неэффективный, поэтому я ищу способ использовать Python или R.

Любые зацепки будут оценены.

может быть это может вам помочь

anky 12.09.2018 12:18

Одним из вариантов, возможно, не лучшим, было бы использование формулы Хаверсина с координатами широты и долготы из пары почтовых индексов.

Tim Biegeleisen 12.09.2018 12:22

@TimBiegeleisen, сославшись на несколько статей, я думаю, что формула Хаверсина не была бы действительно точной

lightyagami96 12.09.2018 12:24
Этот может помочь R. Тяжелую работу выполняет функция gdist в пакете imap. В более общем плане существует ряд Пакеты ГИС в R, несомненно, с различными плюсами и минусами, включая скорость вычислений, точность и простоту использования.
John Coleman 12.09.2018 12:28

Для большей точности вы можете использовать Алгоритм Винсенти, который основан на модели Земли в виде эллипсоида.

Heaven 12.09.2018 13:16

«Я пробовал это в SAS ...» Можете показать, что пробовали? По каким тестам вы определили, что он медленный и неэффективный? На какой рабочей станции или сервере вы используете SAS? Любопытно, какая проблема требует, чтобы вы сначала вычислили все расстояния?

Richard 12.09.2018 14:36

Хэш-таблица должна быть довольно быстрой, и это будет набор данных из 18 миллионов строк, поэтому это займет несколько минут. В какое время ты ждешь?

Reeza 12.09.2018 17:03

Вы также можете использовать предварительно рассчитанные данные (SAS - вариант) и выполнить поиск или форматирование. Не уверен, насколько быстрым может быть формат. обновленная ссылка на самые свежие данные. nber.org/data/census-2010-zip-code-data.html

Reeza 12.09.2018 23:08
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
8
4 849
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

В SAS используйте GEODIST функция.

GEODIST Function

Returns the geodetic distance between two latitude and longitude coordinates.

Syntax

GEODIST(latitude-1, longitude-1, latitude-2, longitude-2 <, options>)

Раствор R

#sample data: first three rows of data provided
df <- data.frame( zip = c( "00501", "00544", "00601" ),
                  longitude = c( -73.045075, -73.045147, -66.750909 ),
                  latitude = c( 40.816799, 40.817225, 18.181189 ),
                  stringsAsFactors = FALSE )

library( sf ) 

#create a spatial data.frame
spdf <- st_as_sf( x = df, 
                  coords = c( "longitude", "latitude"), 
                  crs = "+proj=longlat +datum=WGS84" )

#create the distance matrix (in meters), round to 0 decimals
m <- round( st_distance( spdf ), digits = 0 )

#set row and column names of matrix
colnames( m ) <- df$zip
rownames( m ) <- df$zip

#show distance matrix in meters
m 

# Units: m
#         00501   00544   00601
# 00501       0      48 2580481
# 00544      48       0 2580528
# 00601 2580481 2580528       0
Ответ принят как подходящий

Решение Python

Если у вас есть соответствующие широта и долгота для почтовых индексов, вы можете напрямую рассчитать расстояние между ними, используя формулу Хаверсина с использованием библиотеки mpu, которая определяет расстояние по большому кругу между двумя точками на сфере.

Пример кода:

import mpu

zip_00501 =(40.817923,-73.045317)
zip_00544 =(40.788827,-73.039405)

dist =round(mpu.haversine_distance(zip_00501,zip_00544),2)
print(dist)

Вы получите результирующее расстояние в км. Выход:

3.27

PS. Если у вас нет соответствующих координат для почтовых индексов, вы можете получить то же самое, используя модуль SearchEngine библиотеки uszipcode (только для почтовых индексов США).

from uszipcode import SearchEngine
#for extensive list of zipcodes, set simple_zipcode =False
search = SearchEngine(simple_zipcode=True)

zip1 = search.by_zipcode('92708')
lat1 =zip1.lat
long1 =zip1.lng

zip2 =search.by_zipcode('53404')
lat2 =zip2.lat
long2 =zip2.lng

mpu.haversine_distance((lat1,long1),(lat2,long2))

Надеюсь это поможет!!

Привет! Мы попробовали вышеуказанное решение именно с этими кодами: 00501 и 00544, но мы получаем эту ошибку. [.. \ mpu_в этом_.py ", строка 193, в haversine_distance, если нет (-90.0 <= lat1 <= 90): TypeError: '<=' не поддерживается между экземплярами 'float' и 'NoneType']. Не могли бы вы разрешить я знаю, что мне не хватает?

Santana 08.06.2020 06:38

эй, похоже, он не может идентифицировать один из почтовых индексов. Можете ли вы однажды попробовать установить "simple_zipcode" = False? Дайте мне знать, если это не сработает, я углублюсь в это.

jitesh2796 09.06.2020 22:40

Привет, Джитеш, спасибо за ответ. Мы пробовали использовать эти почтовые индексы 03060 и 03062. Они отлично работали с «ложью» или без нее, но когда мы использовали 03060 и 02222, та же ошибка возвращалась для «ложь» и «истина».

Santana 11.06.2020 07:22

Привет, Сантана, я проверил почтовый индекс 02222. Похоже, широта и долгота, соответствующие этому почтовому индексу, отсутствуют в библиотеке uszipcode. Если вы просто напечатаете различные переменные, zip1, zip2, lat и long и т. д., Вы сможете увидеть доступную информацию. Я проверил почтовый индекс в Интернете и нашел широту и долготу ,, и, используя значения, все работает нормально. uszipcode может не содержать исчерпывающей информации обо всех почтовых индексах, и вы можете поискать, есть ли какая-либо другая доступная библиотека. Надеюсь это поможет....

jitesh2796 11.06.2020 09:19

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