gifts2017

Расчет расстояния между адресами в формате КЛАДР с использованием сервиса Карты.Mail.ru

Опубликовал Дмитрий _________ (cv_admin) в раздел Обмен - Интеграция с WEB

Расчет расстояния между двумя адресами в формате КЛАДР.

Расчет расстояния между двумя адресами в формате Кладр.

Пример работы:

  1. Синхронное получение информации с сайта через Microsoft.XMLHTTP
  2. Конвертирование в UTF16 c использованием jscript через MSScriptControl.ScriptControl

!!!! НЕ СТЕСНЯЕМСЯ СТАВИМ ПЛЮСЫ  (количество загрузок существенно большое количества плюсов).

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Расчет расстояния между адресами с использованием сервиса Карты.Mail.ru
.epf 9,27Kb
19.08.10
277
.epf 9,27Kb 277 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. simuljakr (simuljakr) 08.10.10 16:02
Скажите, а правильно ли я понял, что обработка рассчитывает расстояние в режиме "По времени с учетом пробок" ? Если да, то можно ли сделать чтобы расстояние рассчитывалось в режиме "По времени" ?
2. SolarGard (SolarGard) 22.09.11 17:37
Получая координаты с maps.mail.ru по адресу(из КЛАДРА), выехав далеко за большой город сталкиваешься с отсутствием в их базе домов (а улица есть), улиц (а поселок есть). С сайта возвращается список адресов с искомой улицей но в других городах. Пришлось в обработке в функцию ПолучитьКординатыПоАдресуФНС() добавить повторный загрубленный поиск. Использовал из УПП РазложитьСтрокуВМассивПодстрок(). Результат стал существенно лучше. А вообще хорошая обработка.

Функция ПолучитьКординатыПоАдресуФНС(Адрес)

СтруктураАдреса = УправлениеКонтактнойИнформацией.ПолучитьСтруктуруАдресаИзСтроки(Адрес);

Регион=СтруктураАдреса.Регион;

//Если Найти(Регион,"Санкт-Петербург")=0 Тогда
//ОбщегоНазначения.СообщитьОбОшибке("Маршрут возможно определить только в Санкт-Петербурге");
// Возврат "";
//КонецЕсли;

//стрАдрес=СтруктураАдреса.Дом+?(СтруктураАдреса.Корпус="","","+"+СтруктураАдреса.Корпус)+","+СтруктураАдреса.Улица+ "," + СтруктураАдреса.НаселенныйПункт+ "," + СтруктураАдреса.Район+","+СтруктураАдреса.Регион;
стрАдрес=СтруктураАдреса.Регион +"," + СтруктураАдреса.Район +","+ СтруктураАдреса.Город +","+ СтруктураАдреса.НаселенныйПункт + ","+СтруктураАдреса.Улица + "," + СтруктураАдреса.Дом+?(СтруктураАдреса.Корпус="","","+"+СтруктураАдреса.Корпус) ;
АдресUTF16=ПроцедураПреобразоватьСтрокуВUTF16(стрАдрес);
ДанныеСКоординатами=ПроцедураПолучитьДанныеССервера("GeoObjectSearch.aspx?SearchStringKey="+АдресUTF16);

//Разбор ответа сервера

СимволРазбиения="||";
// Если заполнен населенный пункт

СтрокаДанныеСКоординатами = Прав(ДанныеСКоординатами,СтрДлина(ДанныеСКоординатами)-Найти(ДанныеСКоординатами,"Path: '" )-6);
Если Найти(СтрокаДанныеСКоординатами,"; Российская Федерация, государство; ',") Тогда
СтрокаДанныеСКоординатами = Лев(СтрокаДанныеСКоординатами,Найти(СтрокаДанныеСКоординатами,"; Российская Федерация, государство; ',"));
Иначе
СтрокаДанныеСКоординатами = Лев(СтрокаДанныеСКоординатами,Найти(СтрокаДанныеСКоординатами,"; ', CntrLat:,"));
КонецЕсли;
МассивДанныеСКоординатами = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтрокаДанныеСКоординатами, ";");

Если СтруктураАдреса.НаселенныйПункт <> "" Тогда

НаселенныйПунктМассив = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтруктураАдреса.НаселенныйПункт, " ");
НаселенныйПункт = "";
Для к=0 По НаселенныйПунктМассив.Количество()-2 Цикл
НаселенныйПункт = НаселенныйПункт + НаселенныйПунктМассив[к]+ " ";
КонецЦикла;
НаселенныйПункт = СокрП(НаселенныйПункт);

ЕстьНаселенныйПункт = 0;
Для Каждого ЭлементМассива из МассивДанныеСКоординатами Цикл
Если Найти(ЭлементМассива,НаселенныйПункт) Тогда
ЕстьНаселенныйПункт = ЕстьНаселенныйПункт + 1;
КонецЕсли;
КонецЦикла;

Если ЕстьНаселенныйПункт = 0 Тогда
Сообщить("Мэйл не находит населенный пункт : " + НаселенныйПункт);
стрАдрес=СтруктураАдреса.Регион + "," + СтруктураАдреса.Район + "," + СтруктураАдреса.НаселенныйПункт ;
АдресUTF16=ПроцедураПреобразоватьСтрокуВUTF16(стрАдрес);
ДанныеСКоординатами=ПроцедураПолучитьДанныеССервера("GeoObjectSearch.aspx?SearchStringKey="+АдресUTF16);
ИначеЕсли СтруктураАдреса.Улица <> "" Тогда

УлицаМассив = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтруктураАдреса.Улица, " ");
Улица = "";
Для к=0 По УлицаМассив.Количество()-2 Цикл
Улица = Улица + УлицаМассив[к]+ " ";
КонецЦикла;
Улица = СокрП(Улица);

ЕстьУлица = 0;
МассивДанныеСКоординатами = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтрокаДанныеСКоординатами, ";");
Для Каждого ЭлементМассива из МассивДанныеСКоординатами Цикл

Если Найти(ЭлементМассива,Улица) Тогда
ЕстьУлица = ЕстьУлица + 1;

КонецЕсли;
КонецЦикла;
Если ЕстьУлица = 0 Тогда
Сообщить("Мэйл не находит улицу: " + Улица);
КонецЕсли;
КонецЕсли;
КонецЕсли;

Если СтруктураАдреса.Город <> "" Тогда
ГородМассив = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтруктураАдреса.Город, " ");
Город = "";
Для к=0 По ГородМассив.Количество()-2 Цикл
Город = Город + ГородМассив[к]+ " ";
КонецЦикла;
Город = СокрЛП(Город);


ЕстьГород = 0;
Для Каждого ЭлементМассива из МассивДанныеСКоординатами Цикл
Если Найти(ЭлементМассива,Город) Тогда
ЕстьГород = ЕстьГород + 1;
КонецЕсли;
КонецЦикла;

Если ЕстьГород = 0 Тогда
Сообщить("Мэйл не находит город : " + Город);
стрАдрес=СтруктураАдреса.Регион +"," + СтруктураАдреса.Район +","+ СтруктураАдреса.Город +","+ СтруктураАдреса.НаселенныйПункт + ","+СтруктураАдреса.Улица;
АдресUTF16=ПроцедураПреобразоватьСтрокуВUTF16(стрАдрес);
ДанныеСКоординатами=ПроцедураПолучитьДанныеССервера("GeoObjectSearch.aspx?SearchStringKey="+АдресUTF16);

КонецЕсли;

КонецЕсли;

//Получить адрес
ДанныеСКоординатами=СтрЗаменить(ДанныеСКоординатами,"Path: '",СимволРазбиения);
ДанныеСКоординатами=СтрЗаменить(ДанныеСКоординатами,"; Российская Федерация, государство; ',",СимволРазбиения);
//%%% SolarGard - начало
ДанныеСКоординатами=СтрЗаменить(ДанныеСКоординатами,"; ', CntrLat: ",СимволРазбиения);
//%%% SolarGard - конец
ДанныеСКоординатами=СтрЗаменить(ДанныеСКоординатами,"CntrLat: ","");
ДанныеСКоординатами=СтрЗаменить(ДанныеСКоординатами,", CntrLon:",СимволРазбиения);
ДанныеСКоординатами=СтрЗаменить(ДанныеСКоординатами,", MinLat: ",СимволРазбиения);


мнчСтрока=СтрЗаменить(ДанныеСКоординатами,СимволРазбиения,Символы.ПС);

сч=1;

ТаблицаАдресов=Новый ТаблицаЗначений;

ТаблицаАдресов.Колонки.Добавить("Адрес",ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(300));
ТаблицаАдресов.Колонки.Добавить("КоординатаX",ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(30));
ТаблицаАдресов.Колонки.Добавить("КоординатаY",ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(30));

//Если указан корпус, то mail.ru все равно возвращает несколько адресов
ВыбранныйАдрес=Неопределено;

Пока сч<СтрЧислоСтрок(мнчСтрока) Цикл

НоваяСтрока=ТаблицаАдресов.Добавить();

НоваяСтрока.Адрес=СтрПолучитьСтроку(мнчСтрока,сч+1);
//// Преобразование значения к типу Число не может быть выполнено !!!!!
Попытка
НоваяСтрока.КоординатаY=Формат(Число(СокрЛП(СтрПолучитьСтроку(мнчСтрока,сч+2))),"ЧГ=0;ЧРД=.");
НоваяСтрока.КоординатаX=Формат(Число(СокрЛП(СтрПолучитьСтроку(мнчСтрока,сч+3))),"ЧГ=0;ЧРД=.");
Исключение

КонецПопытки;

сч=сч+5;

//Если ЗначениеЗаполнено(СтруктураАдреса.Корпус) и Не ЗначениеЗаполнено(ВыбранныйАдрес) Тогда
//
// //Получаем первый корпус
// ВыбранныйАдрес=НоваяСтрока;
//
//КонецЕсли;

КонецЦикла;

//Если используется корпус
Если ТаблицаАдресов.Количество()>0 ТОгда
Возврат ТаблицаАдресов.Получить(0);
Иначе
Возврат Неопределено;
КонецЕсли

КонецФункции

// Функция "расщепляет" строку на подстроки, используя заданный
// разделитель. Разделитель может иметь любую длину.
// Если в качестве разделителя задан пробел, рядом стоящие пробелы
// считаются одним разделителем, а ведущие и хвостовые пробелы параметра Стр
// игнорируются.
// Например,
// РазложитьСтрокуВМассивПодстрок(",ку,,,му", ",") возвратит массив значений из пяти элементов,
// три из которых - пустые строки, а
// РазложитьСтрокуВМассивПодстрок(" ку му", " ") возвратит массив значений из двух элементов
//
// Параметры:
// Стр - строка, которую необходимо разложить на подстроки.
// Параметр передается по значению.
// Разделитель - строка-разделитель, по умолчанию - запятая.
//
//
// Возвращаемое значение:
// массив значений, элементы которого - подстроки
//
Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт

МассивСтрок = Новый Массив();
Если Разделитель = " " Тогда
Стр = СокрЛП(Стр);
Пока Истина Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = СокрЛ(Сред(Стр,Поз));
КонецЦикла;
Иначе
ДлинаРазделителя = СтрДлина(Разделитель);
Пока Истина Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = Сред(Стр,Поз+ДлинаРазделителя);
КонецЦикла;
КонецЕсли;

КонецФункции // глРазложить
3. SolarGard (SolarGard) 22.09.11 17:43
"Российская Федерация, государство" - не всегда в ответе бывает
надо добавить (обратите внимание)
//%%% SolarGard - начало
ДанныеСКоординатами=СтрЗаменить(ДанныеСКоординатами,"; ', CntrLat: ",СимволРазбиения);
//%%% SolarGard - конец
4. Сергей (seandr) 03.10.11 15:54
Наработка отличная... сделал на ее базе документ рассчета маршрута доставки. Остается один вопрос. Кто-нибудь пытался разделить расстояния на пересечении МКАД? Мне надо считать расстояние от МКАД.
5. Дмитрий _________ (cv_admin) 03.10.11 22:51
1. Получаем массив точек (Координат съезда с МКАД)
2. По адресу за МКАД получаем координату необходимой точки
3. Определяем ближайшую точку съезда МКАД. (
Алгоритм - Поиск ближайшей точки к заданной
http://programmersforum.ru/showthread.php?t=51343
http://www.rsdn.ru/forum/alg/1548606.flat.aspx)
4. От точки съезда можно новый маршрут построить от съезда с МКАД до нужной точки
6. Лера (Lerusena) 16.11.11 02:06
Полезная вещь. помогла с расчетом расстояний. хотя честно сказать МАЙЛ не совсем верно считает. ну если погрешность заложить вполне сносно. Спасибо.
7. Иван Булычёв (bitem) 07.01.12 05:00
+ за Идею. Проблема просто в картах поисковых систем (не только майл). Сам все перепробовал - не знают они 60% адресов. Чтобы юзать в работе нужна точность выше, а это уже за денюшки(
8. simuljakr (simuljakr) 09.07.13 16:58
Для Яндекса бы такую разработку...
Мэйл ру совершенно не работает....

По запросу:
Москва г, Горлов туп, дом 27 с 5

Выдает 6 страниц результатов !!
Первый из них:
Каширский проезд, 27С5
9. Александр Николаев (tendercement) 06.04.15 13:14
Выдает ошибку:

{ВнешняяОбработка.РасчетРасстоянияМеждуАдресами.МодульОбъекта(61)}: Преобразование значения к типу Число не может быть выполнено
НоваяСтрока.КоординатаY=Формат(Число(СокрЛП(СтрПолучитьСтроку(мнчСтрока,сч+2))),"ЧГ=0;ЧРД=.");
10. Вася Неизвестный (dismoitout) 07.04.16 17:40
Обработка нерабочая - выдает ошибку

{ВнешняяОбработка.РасчетРасстоянияМеждуАдресами.МодульОбъекта(61)}: Преобразование значения к типу Число не может быть выполнено
НоваяСтрока.КоординатаY=Формат(Число(СокрЛП(СтрПолучитьСтроку(мнчСтрока,сч+2))),"ЧГ=0;ЧРД=.");
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа