В API Яндекс.Карт существует возможность реализации поиска по карте с использованием геокодирования.
Пример реализации представлен на странице по адресу http://api.yandex.ru/maps/jsapi/examples/geocoding.html
Для точного поиска адреса в каком-либо городе, например в Нижнем Новгороде, необходимо указывать в строке поиска и название города, либо подставлять его автоматически в поисковую фразу.
Существует возможность ограничить область поиска задав ее значениями координат для левой нижней и правой верхней точками.
Как это сделать я покажу на конкретном примере
С начала нужно определить необходимые координаты точек для области поиска, сделать это можно используя сервис определения координат по адресу http://api.yandex.ru/maps/tools/getlonglat/
Для Нижнего Новгорода это следующие координаты: левая нижняя — 43.69101,56.166626 и правая верхняя — 44.175786,56.407228.
В качестве исходного кода возьмем уже упоминавшийся здесь пример по адресу http://api.yandex.ru/maps/jsapi/examples/geocoding.html
Заменим только в начале ключ к API Яндекс.Карт и координаты центра карты на 44.0, 56.316667 и уровень масштаба 12, а также уберем ссылки ниже окна карты и в форме поиска уберем значение по умолчанию value="Москва".
В результате получим следующий код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Примеры. Сервисы. Геокодирование.</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="http://api-maps.yandex.ru/1.1/index.xml?key=AIW0o0kBAAAAkwyUMwMAEkDz8ddCkU0UnlyLEu4ddFBXhQQAAAAAAAAAAAA1Md4ULCo5QbciEo5T26eV1lhuEQ==" type="text/javascript"></script>
<script type="text/javascript">
var map, geoResult;
window.onload = function () {
map = new YMaps.Map(document.getElementById("YMapsID"));
map.setCenter(new YMaps.GeoPoint(44.0, 56.316667),12);
map.addControl(new YMaps.TypeControl());
}
function showAddress (value) {
map.removeOverlay(geoResult);
var geocoder = new YMaps.Geocoder(value, {results: 1, boundedBy: map.getBounds()});
YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
if (this.length()) {
geoResult = this.get(0);
map.addOverlay(geoResult);
map.setBounds(geoResult.getBounds());
}else {
alert("Ничего не найдено")
}
});
}
</script>
</head>
<body>
<form action="#" onsubmit="showAddress(this.address.value);return false;">
<p>
<input type="text" id="address" style="width:525px;" value="" />
<input type="submit" value="Искать" />
</p>
<div id="YMapsID" style="width:600px;height:400px"></div>
</form>
</body>
</html> |
Нам нужно ограничить область поиска, сделать это можно задав ее границы с помощью параметра геокодера boundedBy.
С этой области начнется вестись поиск, но количество найденных результатов не сократится, изменится только релевантность результатов.
Для Нижнего Новгорода область задается следующим кодом:
var mysearchBounds = new YMaps.GeoBounds(new YMaps.GeoPoint(43.69101,56.166626), new YMaps.GeoPoint(44.175786,56.407228) );
var geocoder = new YMaps.Geocoder(value, {boundedBy : mysearchBounds, strictBounds : true}); |
Параметр геокодера strictBounds, указывает, что необходимо производить поиск только внутри области, заданной опцией boundedBy.
Полный код примера после внесения исправлений:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>API Яндекс.Карт – ограничиваем область поиска</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="http://api-maps.yandex.ru/1.1/index.xml?key=AIW0o0kBAAAAkwyUMwMAEkDz8ddCkU0UnlyLEu4ddFBXhQQAAAAAAAAAAAA1Md4ULCo5QbciEo5T26eV1lhuEQ==" type="text/javascript"></script>
<script type="text/javascript">
var map;
var geoResult;
window.onload = function () {
map = new YMaps.Map(document.getElementById("YMapsID"));
map.setCenter(new YMaps.GeoPoint(44.0, 56.316667),12);
}
function showAddress (value) {
map.removeOverlay(geoResult);
var mysearchBounds = new YMaps.GeoBounds(new YMaps.GeoPoint(43.69101,56.166626), new YMaps.GeoPoint(44.175786,56.407228) );
var geocoder = new YMaps.Geocoder(value, {boundedBy : mysearchBounds, strictBounds : true});
YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
if (this.length()) {
geoResult = this.get(0);
map.addOverlay(geoResult);
map.setBounds(geoResult.getBounds());
geoResult.openBalloon();
}else {
alert("Ничего не найдено")
}
});
}
</script>
</head>
<body>
<form action="#" onsubmit="showAddress(this.address.value);return false;">
<p>
<input type="text" id="address" style="width:525px;" value="" />
<input type="submit" value="Искать" />
</p>
<div id="YMapsID" style="width:600px;height:400px"></div>
</form>
</body>
</html> |
Посмотреть пример в действии можно здесь.
В строке поиска набираем Фрунзе, 6 и получаем участок карты Нижнего Новгорода с открытым балуном на данном адресе.
Если тоже ввести на странице по адресу http://api.yandex.ru/maps/jsapi/examples/geocoding.html получим совершенно другой результат (Россия, Москва, улица Тимура Фрунзе, 8).
Более расширенный пример по работе с геокодером можно посмотреть по адресу: http://ymaps.narod2.ru/examples/geocode-search.html
спасибо огромное! просто отлчино!!!