Преобразование широты/долготы в название города? (обратная геолокация)
Я работаю над доской объявлений Codeigniter PHP + jQuery, где работодатели вводят свое местоположение, и мы используем API Карт Google для его построения. Хотя это и привело к огромным результатам юзабилити, проблема заключается в том, что мы пытаемся отобразить эти места для соискателей, которых они запутали, и трудно визуально различить (они читают так: "02905, в 2 милях от", "171 John St., 4 миль", "Провиденс, RI, 10 миль".
Я хочу, чтобы иметь возможность отменить геолокацию от долготы/широты до заданного уровня (в идеале, название города), чтобы в результатах поиска я мог указывать такие места следующим образом: "Провидение, RI, 10 миль", "Провиденс, RI, 5 миль", "Кранстон, RI, 16 миль".
Есть ли способ изменить геокодирование в город? Я вижу много примеров способов обращения геокода к ближайшему адресуемому адресу, но никак не контролировать уровень.
Надеюсь, что ясно! Не стесняйтесь комментировать любые вопросы, которые вам нужны.
Ответы
Ответ 1
Google Geocoder, который поддерживает обратное геокодирование, возвращает address_components. Вам просто нужно вытащить компонент адреса с тегами locality
и political
, если вам просто нужно название города. Если вам нужны состояния, они помечены тегом administrative_area_level_1
Ответ 2
БЕСПЛАТНЫЕ ИСТОЧНИКИ (например, Creative Commons)
географических названий
Если вы ищете бесплатные источники (как свободы), вы можете использовать API-интерфейс Geonames findNearbyPlaceName.
Например, следующее возвращается к ближайшему плакату:
http://api.geonames.org/findNearbyPlaceName?lat=47.3&lng=9&username=demo
Дополнительная информация доступна здесь
http://www.geonames.org/export/web-services.html#findNearbyPlaceName
Freebase
Вместо одиночной точки требуется ограниченный прямоугольник. Образец вызова:
http://api.freebase.com/api/service/geosearch?location=[30.2,50.4,30.6,50.8]&location_type=/location/citytown&inside=true&indent=1
Geocoder.ca
Обратное геокодирование для североамериканских адресов.
Информация: http://geocoder.ca/
Образец вызова: http://geocoder.ca/?latt=40.70771000786733&longt=-74.0109443664550&reverse=1&allna=1&geoit=xml&corner=1&jsonp=1&callback=test
Map Quest API
Использование номинальной услуги Open Street Map:
http://open.mapquestapi.com/nominatim/v1/search?q=50.4,30.4&format=json
БЕСПЛАТНЫЕ ИСТОЧНИКИ
Yahoo PlaceFinder
Документация http://developer.yahoo.com/geo/placefinder/
Пример вызова:
http://where.yahooapis.com/geocode?q=38.898717,+-77.035974&gflags=R&appid=[yourappidhere]
API Карт Google
Документация:
http://code.google.com/apis/maps/documentation/geocoding/#ReverseGeocoding
Ответ 3
Разве вы не можете просто сделать полный адрес, а затем отбросить улицу и номер?
Я бы сказал, что было бы более полезно использовать полный адрес, чтобы получить более точное расстояние (даже если вы показываете только город, состояние).
EDIT: если вы это сделаете, по крайней мере, он должен быть возвращен в стандартной форме, после чего вы сможете легко повторно вывести данные, из которых вы хотите.
Ответ 4
Услуги обратной геокодирования (такие как Google, Yahoo и GeoNames) будут хорошо работать для этой цели с несколькими оговорками:
- Хотя я не могу точно сказать, как работают коммерческие сервисы, в прошлый раз, когда я проверил GeoNames, для определения города используется стратегия ближайших точек интереса. Это может быть проблемой, если точка запроса несколько близка к границе между двумя городами, а ближайшая запись в базе данных GeoNames находится на другой стороне этой границы. Это на самом деле происходит в моем опыте, так что это не просто техничность.
- Кроме того, если вы обеспокоены опытом пользователей, любое решение веб-API добавляет задержки и снижает надежность.
Я запускаю веб-сайт, который предлагает ряд коммерческих географических веб-API, и продает библиотеки Java, которые мы создали для поддержки этих API. Один из них (который имеет только покрытие в США) использует правильную полигональную карту городов и поселков в США, чтобы вернуть результат, содержащий ваш запрос. Это точно и быстро, поэтому, если это критически важный компонент вашей системы, я предлагаю взглянуть на наш веб-сайт:
http://askgeo.com
Страница, которая предназначена для поиска городов с помощью lat/lon:
http://askgeo.com/database/UsPlace2010
Ответ 5
Я искал API для преобразования lat/long в город. Похоже, это был оригинальный вопрос и в этой теме.
Я видел данные http://download.geonames.org/export/dump/ ", разделяемые в другой потоке stackoverflow Учитывая lat/длинные координаты, как мы можем узнать город/страну? и реализовали мою собственную веб-службу.
Вы можете видеть, что он работает на http://scatter-otl.rhcloud.com/location?lat=36&long=-78.9 Просто измените широту и долготу для ваших местоположений.
Он развернут на OpenShift (платформа RedHat). Первый вызов после длительного периода ожидания может занять некоторое время, но обычно производительность удовлетворительная. Не стесняйтесь использовать эту услугу, как вам нравится...
Также вы можете найти источник проекта https://github.com/turgos/Location.
Ответ 6
Для геолокации Html5 требуется разрешение пользователя. Если вы не хотите этого поведения, вы можете обратиться за внешним поставщиком, например https://geoip-db.com. Они предлагают бесплатную услугу геолокации на основе ip-адресов.
Попробуйте этот пример:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"/>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Geo City Locator</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body >
<div>Country: <span id="country"></span></div>
<div>State: <span id="state"></spa></div>
<div>City: <span id="city"></span></div>
<div>Latitude: <span id="latitude"></span></div>
<div>Longitude: <span id="longitude"></span></div>
<div>IP: <span id="ip"></span></div>
<script>
$.getJSON('https://geoip-db.com/json/geoip.php?jsonp=?')
.done (function(location) {
$('#country').html(location.country_name);
$('#state').html(location.state);
$('#city').html(location.city);
$('#latitude').html(location.latitude);
$('#longitude').html(location.longitude);
$('#ip').html(location.IPv4);
});
</script>
</body>
</html>