2012-02-01 1 views
3

Учитывая радиус 100 км от базового города (geonameid), мне нужно найти близлежащие города.Как получить близлежащие города города (geonameid) в python?

Мой скрипт находится в python. Есть ли API, чтобы это выяснить?

Благодаря

+0

Вы с помощью веб-сервиса GEONAMES, или же вы загружаете в локальную базу данных? –

+0

Я использую web-сервис Geonames. – shaikh

ответ

10

Если у вас есть база данных городов, взглянуть на this example, который показывает, как создавать запросы SQL для этой конкретной задачи.

SELECT id, (3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20; 

Так что если у вас есть свои собственные базы данных или город или вы готовы создать базу данных, которая имеет место и координату некоторых городов (может быть доступно где-то в интернете), то это решение будет работать для вас.

В качестве альтернативы, если у вас нет базы данных, и вы хотите использовать API, такой как Google Maps, посмотрите на The Google Geacoding API и обратное геокодирование в частности. Запрос, такой как:

http://maps.googleapis.com/maps/api/geocode/json?latlng=40.7,-73.9&sensor=false 

Позволяет предоставить вам возможные адреса для долготы и широты, которые вы предоставили.

К сожалению Google Places API (около мест) работает только для таких вещей, как рестораны, магазины, бары и т.д ..

+1

На самом деле, Места включают в себя также кучу типов, которые являются не только заведениями, но также включают местность, страну, административные единицы и еще одну группу: http://code.google.com/apis/maps/documentation/places/supported_types .html –

+1

@ManoMarks Да, но эти типы «поддерживаются API Places при отправке запросов на поиск места». – MMM

+0

Право, я не совсем уверен, что вы делаете, тогда, когда вы говорите: «К сожалению, Google Places API (рядом с местами) работает только на такие вещи, как рестораны, магазины, бары и т. Д.» –

0

Боюсь, ни API геокодирования, ни API Адресов поможет вам так, как вы хотите.

Обратное геокодирование даст вам город для данного latlng, но не тот, который находится вокруг этого. Места API даже не это. Эти API-интерфейсы предназначены для разных целей, но я думаю, вы не заинтересованы в этом.

Если вы не нашли API, который делает то, что вы хотите, вам нужно будет создать собственную базу данных и запустить запросы, подобные тем, которые указаны в МММ. Для создания базы данных вы можете использовать набор данных Populated Places от Natural Earth's 1:10m Cultural Vectors. Вам нужно какое-то программное обеспечение ГИС для его обработки и извлечения из тех населенных мест, которые вы бы назвали городами.

+0

OP фактически использует базу данных Geonames –

+0

Еще проще, я не смотрел Geonames до сегодняшнего дня. Таблицы Fusion могут сделать трюк, просто импортируйте свою любимую таблицу cityXXXX, а затем запросите SQL API Fusion Tables, используя пространственное условие ST_INTERSECTS. – miguev

4

Поскольку вы используете веб-сервис GEONAMES, похоже, есть функциональность, встроенная в него, чтобы найти поблизости топонимы:

от: http://www.geonames.org/export/web-services.html

Найти поблизости населенное место/обратное геокодированием

Webservice Тип: REST Url: api.geonames.org/findNearbyPlaceName? Параметры: lat, lng, lang: язык возвращаемого элемента 'name' ( Код псевдоязыка 'local' вернет его на локальном языке), радиус: радиус в км (необязательно), maxRows: максимальное количество строк (по умолчанию 10) стиль: SHORT, MEDIUM, LONG, FULL (по умолчанию = MEDIUM), многословие Возвращенный XML-документ Результат: возвращает самое близкое заполненное место для запроса lat/lng в виде XML-документа. Единицей дистанционного элемента является 'км'.Пример: http://api.geonames.org/findNearbyPlaceName?lat=47.3&lng=9&username=demo

Эта услуга также доступна в формате JSON: http://api.geonames.org/findNearbyPlaceNameJSON?lat=47.3&lng=9&username=demo