RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 819050
Accepted
Alexei Lavrov
Alexei Lavrov
Asked:2020-04-25 15:36:34 +0000 UTC2020-04-25 15:36:34 +0000 UTC 2020-04-25 15:36:34 +0000 UTC

处理搜索结果

  • 772

我正在尝试做我的第一个 js 项目,但在此过程中遇到了一些问题。

从示例中收集必要的功能。其中一个功能应该是这样工作的:一个人在搜索中驱动了一些不准确的东西,例如,一条街道和一个没有城市的房子,然后在地图上给他几个标记的选项。当您单击此类标签时,您需要将其替换为另一个标签或显示带有按钮的特殊气球。反之亦然,当结果为 1 时,必须立即将此类标签替换为红色标签,从而进一步传递地址。

问题是我不明白搜索结果的放置位置以及如何使用它们。我是否需要以某种方式将它们转换为地理对象的集合?

ymaps.ready(init);

function init(){

var myPlacemark, metkaCoord, 
suggestView = new ymaps.SuggestView('searchLine', {boundedBy: [[58.29, 57.47], [56.24, 64.54]]}),
myMap = new ymaps.Map('map', {
	center: [56.83, 60.60],
	zoom: 9
});


myMap.controls.remove('searchControl');
myMap.controls.remove('trafficControl');
myMap.controls.remove('typeSelector');
myMap.controls.remove('rulerControl');


myMap.events.add('click', function (e) {
	var coords = e.get('coords');

	// Если метка уже создана – просто передвигаем ее.
	if (myPlacemark) {
		myPlacemark.geometry.setCoordinates(coords);
	}
	// Если нет – создаем.
	else {
		myPlacemark = createPlacemark(coords);
		myMap.geoObjects.add(myPlacemark);
		// Слушаем событие окончания перетаскивания на метке.
		myPlacemark.events.add('dragend', function () {
			getAddress(myPlacemark.geometry.getCoordinates());
		});
	}
	getAddress(coords);
});

// Создание метки.
function createPlacemark(coords) {
	myMap.geoObjects.removeAll();
	return new ymaps.Placemark(coords, {
		iconCaption: 'поиск...'
	}, {
		preset: 'islands#redDotIconWithCaption',
		draggable: true
	});
}

// Определяем адрес по координатам (обратное геокодирование).
function getAddress(coords) {
	myPlacemark.properties.set('iconCaption', 'поиск...');
	ymaps.geocode(coords).then(function (res) {
		var firstGeoObject = res.geoObjects.get(0);

		myPlacemark.properties
			.set({
				// Формируем строку с данными об объекте.
				iconCaption: [
					// Название населенного пункта или вышестоящее административно-территориальное образование.
					firstGeoObject.getLocalities().length ? firstGeoObject.getLocalities() : firstGeoObject.getAdministrativeAreas(),
					// Получаем путь до топонима, если метод вернул null, запрашиваем наименование здания.
					firstGeoObject.getThoroughfare() || firstGeoObject.getPremise()
				].filter(Boolean).join(', '),
				// В качестве контента балуна задаем строку с адресом объекта.
				balloonContent: firstGeoObject.getAddressLine()
			});

			$('#addressFull').text(firstGeoObject.getAddressLine());
			
			
			$('#addressCoordinates').text('');
			$('#addressCoordinates').text(firstGeoObject.geometry.getCoordinates());
			metkaCoord = firstGeoObject.geometry.getCoordinates()
			$('#addressRegion').text('');
			$('#addressRegion').text(firstGeoObject.getAdministrativeAreas()[0]);
			$('#addressCity').text('');
			$('#addressCity').text(firstGeoObject.getLocalities()[0]);
			$('#addressDistrict').text('');
			$('#addressDistrict').text(firstGeoObject.getLocalities()[1]);
			$('#addressMcrDistrict').text('');
			$('#addressMcrDistrict').text(firstGeoObject.getLocalities()[2]);
			$('#addressStreet').text('');
			$('#addressStreet').text(firstGeoObject.getThoroughfare());
			
			if (firstGeoObject.getPremiseNumber()) {
				$('#addressHouse').removeClass('text-danger');
				$('#addressHouse').text('');
				$('#addressHouse').text(firstGeoObject.getPremiseNumber());
			} else {
				$('#addressHouse').addClass('text-danger');
				$('#addressHouse').text('номера дома нет');
			}

	});
}


/* Начало поисковой строки*/

$('#searchSubmit').bind('click', function (e) {
	myMap.geoObjects.removeAll();
	metkaCoord = null;
	geocode();
});

function geocode() {
	var request = $('#searchLine').val();
	var myGeocoder = ymaps.geocode(request, {boundedBy: [[58.29, 57.47], [56.24, 64.54]], strictBounds: true});
	myGeocoder.then(
		function (res) {
			myMap.geoObjects.add(res.geoObjects);
			myMap.setBounds(myMap.geoObjects.getBounds(), {checkZoomRange:true}).then(function(){ if(myMap.getZoom() > 16) myMap.setZoom(16);});
		},
		function (err) {
			// обработка ошибки
			alert('Ошибка');
		}
	);
}


/* Заменяем найденный объект на нашу метку */




/* Считаем километры */

$('#buildRoute').bind('click', function (e) {
	console.log(metkaCoord);
	ymaps.route([
		'Екатеринбург, проспект Ленина, 39',
		metkaCoord
	]).then(
		function (route) {
			myMap.geoObjects.add(route);
			var routeLength = Math.floor(route.getLength() / 1000);
			$('#routeKm').text(routeLength + ' км');
		},
		function (error) {
			alert("Возникла ошибка: " + error.message);
		}
	);
});






}
body {font-family:'PT Sans', sans-serif;}
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js" integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js" integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm" crossorigin="anonymous"></script>
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>

<link href="https://fonts.googleapis.com/css?family=PT+Sans" rel="stylesheet">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous">


<div class="container my-3">

<h1>Добавление нового объявления</h1>

<p><div class="form-inline"><input type="text" id="searchLine" class="form-control w-50 mr-1" data-provide="typeahead"> <button type="submit" id="searchSubmit" class="btn btn-primary">Показать на карте</button></div></p>

<p><div id="map" style="width: 100%; height: 400px"></div></p>

<p id="addressFull">Полный адрес</p>

<table>
<tr>
	<td>Координаты:</td>
    <td id="addressCoordinates"></td>
</tr>
<tr>
	<td>Область:</td>
    <td id="addressRegion"></td>
</tr>
<tr>
	<td>Город:</td>
    <td id="addressCity"></td>
</tr>
<tr>
	<td>Район:</td>
    <td id="addressDistrict"></td>
</tr>
<tr>
	<td>Микрорайон:</td>
    <td id="addressMcrDistrict"></td>
</tr>
<tr>
	<td>Улица:</td>
    <td id="addressStreet"></td>
</tr>
<tr>
	<td>Дом:</td>
    <td id="addressHouse"></td>
</tr>
</table>
<p class="mt-5"><button id="buildRoute" class="btn btn-secondary">Посчитать километры от центра</button></p>
<p>Сколько километров от центра: <span id="routeKm">не известно</span></p>


</div>

yandex-maps-jsapi
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Denis Stepanov
    2020-04-25T18:59:14Z2020-04-25T18:59:14Z

    https://jsfiddle.net/cLynjk3c/2/

    function geocode() {
        var request = $('#searchLine').val();
        var myGeocoder = ymaps.geocode(request, {boundedBy: [[58.29, 57.47], [56.24, 64.54]], strictBounds: true});
        myGeocoder.then(function (res) {
        // !!! В res результаты поиска
        // res.geoObjects - гео-объекты, найденных мест
        if (res.geoObjects.getLength() === 1) {
            createMyPlacemark(res.geoObjects.get(0).geometry.getCoordinates());
        } else {
            myMap.geoObjects.add(res.geoObjects);
            myMap.setBounds(myMap.geoObjects.getBounds(), {checkZoomRange:true}).then(function(){ if(myMap.getZoom() > 16) myMap.setZoom(16);});
        }}, function (err) {
            // обработка ошибки
            alert('Ошибка');
        });
    }
    

    https://tech.yandex.ru/maps/jsbox/2.1/balloon_autopan - 这是为气球创建自定义布局的示例 https://tech.yandex.ru/maps/doc/jsapi/2.1/ref/参考/GeoObject- docpage/ - 地理对象的描述

    • 1

相关问题

  • StretchyIcon 的可点击区域

  • 我无法将 html 标记添加到 Yandex 地图上的气球

  • 折线顶点颜色

  • DblClickZoom 禁用

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5