helpf.pro
Регистрация
 +3 
Распечатать

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

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

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

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

Код 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>
Разместил:   Версии: | 8.3 |  Дата:   Прочитано: 14127
 +3 
Распечатать
Возможно, вас также заинтересует
1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш
Google maps, поиск оптимального маршрута 5
В данном посте хочу коснуться основных аспектов построения оптимального маршрута с использованием API Google maps. Исходные данные для построения маршрута: * Географические координаты объектов, которые хранятся в базе; * Координаты начальной и коне
Автоматическая установка ширины колонки табличного документа. 0
Процедура, которая " примерно" делает автоширину колонок (навроде, как если бы выделить все колонки и дважды щелкнуть мышкой по границе заголовка колонки). Привожу текст, работает неахти, но лучше чем ничего: Процедура РасчетШириныКолонок(Табличный
Как в 1С посчитать расстояние между двумя географическими координатами? 5
На одном проекте была платная работа с картами и отображением складов на них, часто требовалось рассчитать расстояние между географическими координатами. Земля может быть описана как сфера, поэтому для вычисления расстояния между точками на пове
Как Свернуть, Развернуть узлы Дерева значений на форме? 4
Как программно свернуть/развернуть дерево значений на управляемой форме? Желательно НаКлиенте. КоллекцияЭлементовДерева=ДеревоНоменклатуры.ПолучитьЭлементы(); //Свернуть дерево Для Каждого Строка Из КоллекцияЭлементовДерева Цикл ИдентификаторСт
Посмотреть все результаты поиска похожих
Комментарии
aleksey200505
16.08.2019 05:03Комментарий: 2
aleksey200505

Вроде получилось.

А как передать из 1с координаты для отрисовки ?

aleksey200505
12.08.2019 08:39Комментарий: 1
aleksey200505

Пытаюсь в управляемых формах применить, но как-то не особо получается. 

Карта отображается, но вот выделить область получается только в браузере, в 1с только отображается карта, а вот выделить область не получается. Подскажите в чем может быть дело ?

Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.