Помогите новичку разобраться с поиском

Впервые столкнулся с OpenStreetMaps.
Нужно сделать небольшой сайт с использованием osm.Карты я подключил, а вот как сделать поск по карте - не понимаю.
Можете привести пример что нужно написать в коде, чтобы поиск был прямо с моего сайта, а не перебрасывал например на nominatim.
З.Ы. как и сказал - сталкиваюсь с этим впервые, так что можно поподробней…

Просто из яваскрипта делаешь XMLHttpRequest на http://nominatim.openstreetmap.org/search? с нужными параметрами, результат можно получать в xml или json. А затем говоришь OpenLayers переместиться в точку, ну или выводишь список.

Вот здесь есть примеры: http://wiki.openstreetmap.org/wiki/Nominatim

а какие параметры нужно передавать?

Зайдите на вики, там всё написано по пунктам! :slight_smile:

хм там все по английски.А я в нем не очень((

http://wiki.openstreetmap.org/wiki/Nominatim#Parameters
Какой конкретно параметр непонятен? :slight_smile:

наример это
json_callback=
Wrap json output in a callback function (JSONP) i.e. ()

Если данные возвращаются в формате json, то с этим параметром они оборачиваются в функцию. Можно сделать eval(), или как там это в яваскрипте, на результат, и вызовется функция с результатом.

Это, как я понял, опциональный параметр, специально сделан чтобы обойти защиту в браузере, которая мешает делать AJAX запросы на другие домены.

Т.е. если карта на сайте example.com, а поиск хочешь использовать на nominatim.openstreetmap.org, то простой ajax (XMLHttpRequest) уже может не прокатить. Зависит от настроек пользователя. Тут обычно делают простой прокси на своём example.com, который просто пробрасывает запросы на nominatim.openstreetmap.org или используют трюк с json_callback.

Для последнего надо сделать фукнцию, которая покажет результаты. Например showResults, а потом переделать функцию, которая запускает поиск (по кнопке “Найти”), чтобы она в конец документа добавляла тег примерно так:


<script type='text/javascript' src='http://nominatim..../...?json_callback=showResults;..параметры поиска..'></script>

Браузер видит новый скрипт в документе и пытается его подгрузить. Делает запрос на сервер nominatim. Тот делает поиск и возвращает специально сформированный javascript, который вызовет showResults и передаст результат поиска в качестве параметров.

PS: Я, кстати сейчас делаю как раз такую штуку с картой, снимками спутника, оверлеем поиском и т.д. которую можно будет встраивать в сайты несколькимим строчками :wink: Надеюсь поиск доделаю на этих выходных.

О.Спасибо огромное.Вроде попонятней стало)).
PS: вы когда поиск доделаете - киньте пожалуйста пример, если не сложно.

Поиск через nominatim сделал :slight_smile: Вот такой nominatim.js получился (чистый исходник).

Использовать примерно вот так: https://gist.github.com/666137 Там всё с комментариями, надеюсь понятно :slight_smile: Опции, которые можно указывать в init и/или в search, перечислены в самом начале файла nominatim.js.

Внешне все запросы к серверу спрятаны вот в такой ассинхронный цикл, как в примере выше (callback → next → callback → next … ) Но внутри он всё же делает запросы к серверу. Как без этого. :slight_smile: В каждом запросе получает не все результаты, а какую-то очередную часть. Размер части определяется параметром limit (по-умолчанию = 10).

Если, например, в первом запросе пришло 10 результатов, а нужно показать 15 (как в примере), то итератор, когда будет вызван iter.next() на 11-ый раз, скрыто запросит следующую партию и вызовет callback как-будто ничего не случилось :slight_smile: Заметно будет только по паузе между вызовами: быстро значит уже есть очередной результат, долго – подгружает.

А чтобы нельзя было войти в длинный цикл, если забыть поставить ограничение и всё время вызывать iter.next() из callback-а, то там есть параметр limit_total (по-умолчанию = 50). Т.е. после 50-го результата остальные подтягиваться не будут, и в callback придёт ‘null’, т.е конец поиска. Если limit_total поставить в 0, то скрипт может просто замучать сервер и IP будет забанен :slight_smile:

Сегодня уже наверное не успею интегрировать в свою карту и показать в дейстии, так что отпишусь отдельно, когда заработает :slight_smile:

Ух ты.Огромная работа проделана)).

Смысл моего проекта – сделать 99% работы по встраиванию openstreetmap + всего-всего-всего в сайт, чтобы можно было только сделать что-то вроде


<div id="osmbundle-map"></div>

<script type="text/javascript">
      OSMTownBundle.init({
         lat  : 5696268.96925,
         lon  : 4262883.58356,
         zoom : 16,
         ... other options ...
      });
</script>

и сразу заработает osm, google, openstreetbugs, поиск, рисовалка, и что там еще можно придумать :slight_smile:

Если это совпадает с твоей целью, то можем пилить вместе :slight_smile:

у меня цель просто сделать карту с поиском, добавлением маркеров из базы данных и отображением gps-треков.Да просто в универе дали задание, типа на курсовой, а я никогда раньше не встречался с этими картами.Поэтому все с нуля узнаю)).

А, курсовая, openlayers уже в обучении? Работу с маркерами видел в примерах. А вот треки не видел, интересно будет посмотреть :slight_smile:

Ну что добавили поиск на свою карту? Хочется посмотреть как все таки пользоваться поиском)).

Скорее всего на выходных :slight_smile: (можно на “ты”)

Ok)))

Жду с нетерпением.

osmisto что то давно тебя уже небыло.Не пропадай))).

У меня редко получается сесть попрограммировать не по работе :slight_smile: Зато вот что нашел: http://wiki.openstreetmap.org/wiki/Openlayers_Track_example