Рапортую еще раз: Алгоритм классный - рекомендую. Прекрасно работает вот с таким объектами в количестве 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
Пришлось посуетиться конечно, зато зато все, как на ладони...