Как получить широту и долготу места в изоморфном приложении на сервере

У меня есть изоморфное приложение, которое также загружается на сервер и клиент. Меня беспокоит загрузка результатов для приложения на сервер. Мне нужно вызвать службу API карт Google, чтобы получить широту и долготу для места, например «www.mysite.com/search/New-York--NY-United-States». затем мне нужно найти его широту и долготу из API карт Google с приведенным ниже кодом в php (мой API находится в php)

 $address= $this->input->get('address');
 $geo = file_get_contents('http://maps.googleapis.com/maps/api/geocode/json?address='.urlencode($address).'&sensor=false');
            $geo = json_decode($geo, true);
            if ($geo['status'] = 'OK') {
              $lat = $geo['results'][0]['geometry']['location']['lat'];
              $lng = $geo['results'][0]['geometry']['location']['lng'];
            }

Затем, основываясь на этой широте и долготе, я ищу свои результаты, как показано ниже.

$radius = 6371;
$distance = 250;
// latitude boundaries
$maxlat = $lat + rad2deg($distance / $radius);
$minlat = $lat - rad2deg($distance / $radius);
// longitude boundaries (longitude gets smaller when latitude increases)
$maxlng = $lng + rad2deg($distance / $radius / cos(deg2rad($lat)));
$minlng = $lng - rad2deg($distance / $radius / cos(deg2rad($lat)));

С помощью приведенного выше кода я рассчитываю максимальную и минимальную широту и долготу, а затем ищу свои результаты, применяя условия, как показано ниже.

$this->db->where('rv.LATITUDE >=', $minlat);
$this->db->where('rv.LATITUDE <=', $maxlat);
$this->db->where('rv.LONGTITUDE >=', $minlng);
$this->db->where('rv.LONGTITUDE <=', $maxlng);

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


person Aakash John    schedule 14.02.2017    source источник


Ответы (1)


Если вы не пытаетесь определить адреса улиц и интересуетесь только отдельными названиями мест, такими как города, достопримечательности и т. д. (в вашем примере Нью-Йорк, США), вы можете изучить различные Экспортируемые объекты GeoNames. Вы можете загрузить их в локальное хранилище данных и выполнить поиск по имени.

person arpieb    schedule 14.02.2017
comment
Но будет ли это быстрее, чем карты Google, и включает ли он все обновленные города? - person Aakash John; 15.02.2017
comment
@AakashJohn не уверен, что вы имеете в виду под всеми обновленными городами, но это очень полный список местоположений по всему миру. Все, что я могу сказать, это проверить его на наличие некоторых крайних случаев, когда вы думаете, что у него может не быть местоположения, и посмотреть, есть ли у него запись. Что касается скорости - если вы запрашиваете локальное хранилище данных, у вас не будет потенциальной сетевой задержки вызова в Google, и в зависимости от того, какое хранилище данных вы используете, вы можете настроить его для очень быстрых запросов. (используя индексы, сегментирование и т. д. в зависимости от вашего решения). - person arpieb; 16.02.2017
comment
Вы даже можете потенциально создать кэш-память с быстрым возвратом самых популярных мест, поскольку, как правило, ориентиры не склонны много перемещаться по своей природе. :) - person arpieb; 16.02.2017