ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
26 апреля
752389 Топик полностью
Гудвин, волшебник (26.04.2017 20:45, просмотров: 380) ответил Гудвин на Поинтересуюсь: Кто как решает задачу определения вхождения точки с определенными координатами в полигон произвольной формы на карте? Например, имеется *.kml файл с несколькими десятками полигонов. Есть задача определить принадлежность точки
Рапортую еще раз: Алгоритм классный - рекомендую. Прекрасно работает вот с таким объектами в количестве 505 штук. Принадлежность находит мгновенно. И даже вот так могЁт... (В "Tip" показывает имя объекта, расстояние до него от точки и направление на объект.) Думал чем тестить, чтобы было наглядно... Нашел в сети программу "SASPlanet", пользующую Win Api. Засосал в нее тот же KML файл, который пользую для тестов. А дальше дело техники: тычу мышОй "создать новую точку". Этот SAS выводит окно для редактирования, в котором присутствуют координаты точки. Далее вступает в дело вот этот скриптик на AutoIt, берет, что нужно из окна, вызывает мою утилитку и выводит в "Tip" результат : while 1 $hWnd = WinWaitActive("Добавить", "", 10000) ; Ждем открытия требуемого окна SAS If $hWnd Then Local $sText1 = WinGetText($hWnd) ; Выгребаем текст окна WinMove($hWnd, "", -400, 100) ; задвигаем окно ""в Малые Ебеня", чтобы не мельтешило в дальнейшем WinClose($hWnd) ; Закрываем окно Local $iPosition = StringInStr($sText1, "E") ; Выковыриваем координаты $sText1 = StringTrimLeft ($sText1, $iPosition ) $iPosition = StringInStr($sText1, """") Local $sText2 = StringLeft ($sText1, $iPosition-1 ) ;MsgBox($MB_SYSTEMMODAL, "", $sText2 ) $iPosition = StringInStr($sText1, "N") $sText1 = StringTrimLeft ($sText1, $iPosition ) $iPosition = StringInStr($sText1, """") $sText1 = StringLeft ($sText1, $iPosition-1 ) Local $arr = StringSplit($sText1, "°'") ; разбиваем строку с координатами на подстроки $arr[3] = StringReplace($arr[3], ",", ".") Local $Degrees = Number($arr[1]) ; переводим координаты ШИРОТЫ из градусов, минут, секунд в десятичные градусы Local $Minutes = Number($arr[2]) Local $Seconds = Number($arr[3]) Local $DD1 = ($Seconds/3600) + ($Minutes/60) + $Degrees Local $arr = StringSplit($sText2, "°'") ; разбиваем строку с координатами на подстроки $arr[3] = StringReplace($arr[3], ",", ".") Local $Degrees = Number($arr[1]) ; переводим координаты Долготы из градусов, минут, секунд в десятичные градусы Local $Minutes = Number($arr[2]) Local $Seconds = Number($arr[3]) Local $DD2 = ($Seconds/3600.0) + ($Minutes/60.0) + $Degrees Local $SH = string($DD1) Local $DL = string($DD2) $iReturn = ShellExecuteWait("geofields.exe","aurora.kml "& $SH & " " & $DL) if $iReturn = 1 then Local $hFileOpen = FileOpen("fieldname.txt", $FO_READ) $sFileRead = FileReadLine($hFileOpen, 1) FileClose($hFileOpen) ;ConsoleWrite($sFileRead & @CRLF) ToolTip($sFileRead) Else ; ConsoleWrite("Поле не найдено!" & @CRLF) ToolTip("Поле не найдено!!!") endif EndIf WEnd Пришлось посуетиться конечно, зато зато все, как на ладони...
image