Поиск zip кодов США и радиус поиска.

В этой статье я хочу показать как сделать простой поиск zip кодов по радиусу от базовой точки.
Если вы занимаетесь этой темой, то вы уже наверняка знаете, что каждый zip код имеет географические координаты. Но теперь возникает вопрос как определить расстояние от базовой точки и найти все коды входящие в данную область.
Для решения поставленной задачи нам понадобятся базовые знания математики (школьный курс) и сама база данных.

Думаю со знанием математики проблем не возникнет, а вот базу данных я выложу чуть позже. Ну а пока рассмотрим сам поиск.
Координаты у нас могут быть заданны в милях или в киллометрах, а так же задана широта и долгота каждой точки,
для примера zip ’00501′, ‘Holtsville’ имеет координаты 40.8131, -73.0464
Для решения задачи нам так же понадобится радиус земного шара в милях и киллометрах соответственно.
R(mi)=3957.5
R(km)=6371
Хочу отметить, что данный радиус является приблизительным, так как наша земля не идеально круглая, но данные о расстоянии получаются достаточно точные.
Определять расстояние мы будем по следующей формуле:
Δlat = lat2− lat1
Δlong = long2− long1
a = sin²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2)
c = 2.atan2(√a, √(1−a))
d = R.c
Радиус естественно подставляем тот который нам нужен, для миль или для киллометров.

пример реализации на JavaScript:

1
2
3
4
5
6
7
8
var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) *
        Math.sin(dLon/2) * Math.sin(dLon/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;

на php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function getDistance($lat1, $lon1,  $lat2, $lon2){
    // 1 радиан равен 0.017453292519943
    $degreeRadius = deg2rad(1);

    $R=6371;

    // переводим в радианы
    $latitudeFrom  = $lat1*$degreeRadius;
    $longitudeFrom = $lon1*$degreeRadius;
    $latituteTo    = $lat2*$degreeRadius;
    $longitudeTo   = $lon2*$degreeRadius;
 
    $d = sin($latitudeFrom) * sin($latituteTo) + cos($latitudeFrom)
       * cos($latituteTo) * cos($longitudeFrom - $longitudeTo);
 
    return ($R * acos($d));
}

базу зипов можно найти на сайте или в статьях по теме




Рекомендуем почитать

 

Добавить комментарий


Ваше имя:


Комментарий:


Введите: Картинка