HelpF.pro

Как получить координаты выделенной области на Яндекс Карте?

На одном проекте потребовалось получать координаты выделенной области на яндекс карте, после долгих изучений получилось следующее:

Вид Формы: На карте выделяете объект, нажимаете кнопку Получить координаты выделенной области и заполняется таблица координат

Код инициализации карты и обработчик кнопки получения координат:

Код 1C v 8.х
 Процедура ИнициализироватьКарту()

ПутьКФайлу = КаталогВременныхФайлов()+"yamaps.html";
Ф = новый Файл(ПутьКФайлу);
Если Ф.Существует() Тогда
УдалитьФайлы(ПутьКФайлу);
КонецЕсли; 

Т = новый ТекстовыйДокумент;
ТД = ЭтотОбъект.ПолучитьМакет("МакетЯндекс");
Т.УстановитьТекст(ТД.ПолучитьТекст());
Т.Записать(ПутьКФайлу);

ЭлементыФормы.Эксплорер.Перейти(ПутьКФайлу);
КонецПроцедуры


Процедура ВыполнитьСкрипт(Команда) Экспорт 
ЭлементыФормы.Эксплорер.document.getElementById("WebClientOperation").value = Команда;
ЭлементыФормы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры


Процедура ПриОткрытии()
ИнициализироватьКарту();
КонецПроцедуры


Процедура ПолучитьКоординатыНажатие(Элемент)
ВыполнитьСкрипт("GetGEO();");
ТекКоординаты=ЭлементыФормы.Эксплорер.document.getElementById("geometry").innerText;
ТекКоординаты=СтрЗаменить(ТекКоординаты,"Координаты: [","");
МассивСтроки = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ТекКоординаты, "], [ ");
Точки.Очистить();
Для Каждого стр из МассивСтроки Цикл 
Текстр=СтрЗаменить(стр,"[","");
Текстр=СтрЗаменить(Текстр,"]","");
Текстр=СокрЛП(Текстр);
нСтрок=Точки.Добавить();
симвЗапятой=Найти(Текстр,","); 
нСтрок.Широта=Лев(Текстр,симвЗапятой-1);
нСтрок.Долгота=Сред(Текстр,симвЗапятой+2,СтрДлина(Текстр));
КонецЦикла;
//Сообщить(ТекКоординаты);
КонецПроцедуры

Макет

Код VBS
 <!DOCTYPE html">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=9"/>
    <style type="text/css">
 html { height: 100% }
 body { height: 100%; margin: 0px; padding: 0px }
 #map { height: 100% }
</style>
    <script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU"  type="text/javascript"></script>
<script src="http://yandex.st/jquery/1.6.4/jquery.min.js" type="text/javascript"></script>
    <script type="text/javascript">
var index = 1;
var MyMap, route;
var clusterer;
var PointArray = [];
var noclick = false;

ymaps.ready(init);
function init(){  
myMap = new ymaps.Map ("map", {
center: [55.75, 37.62],
zoom: 10
}),
        polygon = new ymaps.GeoObject({
        geometry: {
            type: "Polygon",
            coordinates: []
        }
   });
myMap.behaviors.enable('scrollZoom');
myMap.behaviors.disable('dblClickZoom');

myMap.events.add('click', function (e) {
if (!noclick) {
// addMarker(e.get('coords'));
}else{
noclick = false;
}
});

myMap.events.add('drag end', function (e) {
noclick = true;
document.getElementById('CoordX').value = "0";
document.getElementById('CoordY').value = "0";
});

// создадим кластеризатор и запретим приближать карту при клике на кластеры
//clusterer = new ymaps.Clusterer({clusterDisableClickZoom: true, synchAdd: true});
//myMap.geoObjects.add(clusterer);

myMap.geoObjects.add(polygon);
    polygon.editor.startDrawing();
$('input').attr('disabled', false);
 
            // Обработка нажатия на любую кнопку.
            $('input').click(
                function () {
                    // Отключаем кнопки, чтобы на карту нельзя было
                    // добавить более одного редактируемого объекта (чтобы в них не запутаться).
                    $('input').attr('disabled', true);
GetGEO();
                });
}

function addMarker(coordPosition){
myPlacemark = new ymaps.Placemark(coordPosition, {
// Свойства
// Текст метки
iconContent: 'Точка'+index
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: 'islands#blueStretchyIcon'
});
myMap.geoObjects.add(myPlacemark);

document.getElementById('CoordX').value = coordPosition[0].toPrecision(15);
document.getElementById('CoordY').value = coordPosition[1].toPrecision(15);
index++;
}

function calcRoute(options){
ymaps.route(options, {
       // Опции маршрутизатора
       mapStateAutoApply: true, // автоматически позиционировать карту
       avoidTrafficJams: false   // Учитывать пробки
   }).then(
   function (router) {
   route = router;
       myMap.geoObjects.add(route);
       
       //заполняем и сохраняем инфо про маршрут
       document.getElementById('RouteInfo').value = "Длина маршрута - " + route.getHumanLength() + ". Время - " + route.getHumanJamsTime();
       
       //генерация события для перехвата в 1С
       var evt = document.createEventObject();
  document.body.fireEvent('ondatasetcomplete', evt);
   },
   function (error) {
       alert("Возникла ошибка: " + error.message);
   });
}

function calcLine(options){
var poly = new ymaps.Polyline(options, {
hintContent: "Маршрут",
balloonContent: "Маршрут экспедитора",
balloonContentHeader: "",
balloonContentBody: "",
balloonContentFooter: ""
}, {
cursor: "pointer",
draggable: false,
hasBalloon: true,
hasHint: true,
interactiveZIndex: false,
opacity: 1,
openBalloonOnClick: true,
openEmptyBalloon: false,
openEmptyHint: false,
openHintOnHover: true,
strokeColor: '#E33926',
strokeOpacity: 0.8,
strokeStyle: '',
strokeWidth: 5,
syncOverlayInit: false,
visible: true
});
myMap.geoObjects.add(poly);
myMap.setBounds(poly.geometry.getBounds());
}

function Reset(){
// Удаляем все геообъекты на карте
myMap.geoObjects.removeAll();    
PointArray = [];
index = 1;
}

function ChangeCityMSK(){
myMap.panTo([55.75, 37.62], {
            flying: 1
        });
}
function ChangeCitySPB(){
myMap.panTo([59.938531, 30.313497], {
            flying: 1
        });
}
function ChangeCityKRAS(){
myMap.panTo([45.04, 38.97], {
            flying: 1
        });
}
function ChangePlace(k,d){
myMap.panTo([k, d], {
            flying: 1
        });
}



function FindAdres(Adres){
Reset();
var myGeocoder = ymaps.geocode(Adres);
myGeocoder.then(
function (res){
var firstGeoObject = res.geoObjects.get(0);
if(firstGeoObject != null){
myMap.panTo(
// Координаты нового центра карты
firstGeoObject.geometry.getCoordinates(), {
/* Опции перемещения:
  разрешить уменьшать и затем увеличивать зум
  карты при перемещении между точками 
*/
flying: true
}
);

myPlacemark = new ymaps.Placemark(firstGeoObject.geometry.getCoordinates(), {
// Свойства
// Текст метки
iconContent: Adres
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: 'islands#blueStretchyIcon'
});
myMap.geoObjects.add(myPlacemark);
}else{
alert("Ничего не найдено");}
}
);
}

function ReverseSearchAdres(CoordX, CoordY, Adres){
Reset();

var CoordPosition = [CoordX, CoordY];
myMap.panTo(
   // Координаты нового центра карты
   CoordPosition, {
       /* Опции перемещения:
          разрешить уменьшать и затем увеличивать зум
          карты при перемещении между точками 
       */
       flying: true
   }
);

myPlacemark = new ymaps.Placemark(CoordPosition, {
// Свойства
// Текст метки
iconContent: Adres
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: 'islands#blueStretchyIcon'
});
myMap.geoObjects.add(myPlacemark);
}

function addToPointArrayM(CoordX, CoordY, TextC, Text){
var CoordPosition = [CoordX, CoordY];
myPlacemark = new ymaps.Placemark(CoordPosition, {
// Свойства
// Текст метки
iconContent: Text
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: TextC
});
myMap.geoObjects.add(myPlacemark);
}

function addToPointArrayPointOne(CoordX, CoordY, ID, Text){
var point = new ymaps.GeoObject({
   geometry: {type: "Point", coordinates: [CoordX, CoordY>,
   properties: {
       clusterCaption: ID,
       iconContent: ID, 
       hintContent: ID,  
       balloonContent: Text, 
       balloonContentBody: Text
   }
});
myMap.geoObjects.add(point);
}


function addToPointArray(CoordX, CoordY, ID, Text){
var point = new ymaps.GeoObject({
   geometry: {type: "Point", coordinates: [CoordX, CoordY>,
   properties: {
       clusterCaption: ID,
       iconContent: ID, 
       hintContent: ID,  
       balloonContent: Text, 
       balloonContentBody: Text
   }
});
PointArray.push(point);
}

function drawCluster(){
clusterer.add(PointArray);
myMap.geoObjects.add(clusterer);
}

function createPolygon(ArrayPoint, Name, color) {
// Создаем многоугольник
        myPolygon = new ymaps.Polygon([
            // Координаты вершин внешней границы многоугольника.
            ArrayPoint
        ], {
            //Свойства
            hintContent: Name
        }, {
            // Опции.
            // Цвет заливки (зеленый)
            fillColor: color,
            // Цвет границ (синий)
            strokeColor: '#0000FF',
            // Прозрачность (полупрозрачная заливка)
            opacity: 0.6,
            // Ширина линии
            strokeWidth: 5,
            // Стиль линии
            strokeStyle: 'shortdash'
        });
            
        myMap.geoObjects.add(myPolygon);
    }
    
    function WebClientClick() {
    //очистка перед кликом координат, иначе после клика в упр. формах идет считывание координат
    document.getElementById('CoordX').value = "0";
document.getElementById('CoordY').value = "0";
   
    var WebClientOperation = document.getElementById("WebClientOperation").value;
//alert(WebClientOperation);
switch (WebClientOperation) {
        case "0":   // ничего не делаем
          var a = 1; 
        default:   // запускаем функцию
           eval(WebClientOperation);
        }
        document.getElementById('WebClientOperation').value = "0";


function GetGEO(){
polygon.editor.stopEditing(); 
printGeometry(polygon.geometry.getCoordinates());
}
// Выводит массив координат геообъекта в <div id="geometry">
function printGeometry (coords) {
$('#geometry').html('Координаты: ' + stringify(coords));


function stringify (coords) {
var res = '';
if ($.isArray(coords)) {
res = '[ ';
for (var i = 0, l = coords.length; i < l; i++) {
if (i > 0) {
res += ', ';
}
res += stringify(coords[i]);
}
res += ' ]';
} else if (typeof coords == 'number') {
res = coords.toPrecision(6);
} else if (coords.toString) {
res = coords.toString();
}


return res;
}
}  
    </script>
</head>


<body>
<div id="geometry"/></div>
<div id="map" style="width:100%; height:100%"></div>
    <input type="hidden" id="CoordX" name="CoordX" value="0"></input>
    <input type="hidden" id="CoordY" name="CoordY" value="0"></input>
    <input type="hidden" id="RouteInfo" name="RouteInfo" value=""></input>
    <input type="hidden" id="WebClientOperation" name="WebClientOperation" value="0"></input>
    <input type="hidden" id="WebClient" name="WebClient" onclick="WebClientClick();"></input>
    <!-- <input type="button" value="Завершить редактирование" id="stopEditPolyline"/> -->
</body>
</html>

Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq/view/1854.html