Имя: Пароль:
1C
1С v8
Как реализовать поиск области к которой относится точка?
0 arsik
 
гуру
14.12.12
16:30
Пытался методами географических схем, но в 8.1 какой то косяк. При поиске точка попадает сразу в несколько областей.

Суть задачи: Город географически разбит на районы. Известны координаты контуров районов. Как мне определить район куда попадает определенная точка?
1 DirecTwiX
 
14.12.12
16:34
Выпускаешь луч из точки в любом направлении. Если он пересёк контур нечетное число раз, то точка в контура. Иначе вне контура
2 1C-band
 
14.12.12
16:36
Google maps API?
3 arsik
 
гуру
14.12.12
16:42
(1) Не все многоугольники выпуклые.
(2) Цитирую гугл
"Пространственный поиск реализуется в пределах службы Maps Data API за счет ограничения совпадающих компонентов только теми, которые находятся внутри определенной области. Эта область может быть определена следующим образом:

путем указания квадрата поиска;
путем определения радиуса поиска."
4 DirecTwiX
 
14.12.12
16:43
(3) Не имеет значения
5 НЕА123
 
14.12.12
16:44
(3)
>Не все многоугольники выпуклые.
ну что?
6 le_
 
14.12.12
16:44
7 DirecTwiX
 
14.12.12
16:51
(6) Забавно) Ох уж этот комплан.. =)
8 arsik
 
гуру
14.12.12
17:20
(6) Спасибо.
9 arsik
 
гуру
14.12.12
17:21
(4) Точно. нужно и это попробовать
10 arsik
 
гуру
17.12.12
11:21
Может кому ни будь нужно будет.
родилась следующая процедура:

Функция ТочкаВнутриОбласти(локШирота,локДолгота,тКоординат)
   //Сделано на основе алгоритма http://habrahabr.ru/post/125356/
   
   //Уберем последнюю координату, если она такая же как первая.    
   КоличествоКоординат = тКоординат.Количество();
   ПоследняяКоордината = тКоординат[КоличествоКоординат-1];
   ПерваяКоордината = тКоординат[0];
   Если (ПерваяКоордината.Широта = ПоследняяКоордината.Широта) и (ПерваяКоордината.Долгота = ПоследняяКоордината.Долгота) Тогда
       тКоординат.Удалить(ПоследняяКоордината);
       КоличествоКоординат = КоличествоКоординат-1;
   Конецесли;
   
   Если КоличествоКоординат<3 Тогда
       //Это не многоугольник
       Возврат Ложь;
   Конецесли;
   
   ПоследняяКоордината = тКоординат[КоличествоКоординат-1];
   послШирота = ПоследняяКоордината.Широта-локШирота;
   послДолгота = ПоследняяКоордината.Долгота-локДолгота;
   
   Сумма = 0;
   
   Для Каждого СтрокаКоординаты из тКоординат Цикл
       текШирота = СтрокаКоординаты.Широта - локШирота;
       текДолгота = СтрокаКоординаты.Долгота - локДолгота;
       
       Делитель = послШирота*текДолгота - текШирота*послДолгота;
       Если Делитель = 0 Тогда //точка совпадает с узловой координатой
           Возврат Истина;
       КонецЕсли;
       
       Произведение = текШирота*послШирота+текДолгота*послДолгота;
       
       Сумма = Сумма+(ATan((послШирота*послШирота+послДолгота*послДолгота-Произведение)/Делитель)+
                       ATan((текШирота*текШирота+текДолгота*текДолгота-Произведение)/Делитель));
       послШирота = текШирота;
       послДолгота = текДолгота;
   КонецЦикла;
   
   Возврат Окр(Сумма,6)<>0;
КонецФункции
Независимо от того, куда вы едете — это в гору и против ветра!