Привет всем. Нужен макрос по отбору точек с определенными координатами.
Задача заключается в следующем. Это работа с координатами. Есть огромный массив точек на определенной территории. ( 1км х 1км) в ТХТ файле. Текстовой файл очень большой ( от 300 до 700 мБ) Мы знаем координаты Х и У в углах данной территории. Их мы указываем в пути к файлу strFilePath = "C:\ 674000_5102000.txt" то есть левый нижний угол территории = 674000.00,5102000.00 Мне нужно отфильтровать точки через определенную дистанцию которую я буду задавать (допустим 0.5). Значит увеличиваем сначала первое число на 0.5
674000.00,5102000.00 674000.50,5102000.00 674001.00,5102000.00 674001.50,5102000.00 674002.00,5102000.00 674002.50,5102000.00 674003.00,5102000.00 …. 675000.00,5102000.00 пока первое число не будет равно +1000.00 (675000.00). Потом второе число увеличиваем на 0.5 а первое опять увеличиваем 674000.00,5102000.50 674000.50,5102000.50 674001.00,5102000.50 674001.50,5102000.50 674002.00,5102000.50 674002.50,5102000.50 674003.00,5102000.50 ….. 675000.00,5102000.50 И вот так пока конечное значение не достигнет по х и по у 675000.00,5103000.00 В данном шаге мы определяем параметры отбора. То есть ближайшая точка каждой строке и есть то что нам нужно т.е Выбирается точка с параметрами близкими к указанным.
Дано 674216.50,5102536.50 Самая подходящая точка из списка 674217.12,5102536.75,-25.62 674216.50,5102536.63,-25.61 вот эта 674215.88,5102536.52,-25.62 674215.26,5102536.40,-25.62
Трудность заключается в том, что нужно определить точность отбора. Если в строке есть, допустим точки с похожими параметрами то необходимо выбрать самую близкую. Возможно, необходимо задать деопозон от 0.01 до 0.49 Дано 674216.50,5102536.50 Из этих точек лучшая 674216.50,5102536.63,-25.61 674216.50,5102536.51,-25.61 вот эта 674216.54,5102536.63,-25.61 674216.60,5102536.50,-25.61 В приложенном файле примерно показано исходное положение точек и идеальное положение после фильтрации.
На форуме мне помогли с макросом который отбирал из списка точек, точки с определенным шагом. (спасибо Hugo) – Если кому то интересно вы можете почитать это тут. Page
Привет всем. Нужен макрос по отбору точек с определенными координатами.
Задача заключается в следующем. Это работа с координатами. Есть огромный массив точек на определенной территории. ( 1км х 1км) в ТХТ файле. Текстовой файл очень большой ( от 300 до 700 мБ) Мы знаем координаты Х и У в углах данной территории. Их мы указываем в пути к файлу strFilePath = "C:\ 674000_5102000.txt" то есть левый нижний угол территории = 674000.00,5102000.00 Мне нужно отфильтровать точки через определенную дистанцию которую я буду задавать (допустим 0.5). Значит увеличиваем сначала первое число на 0.5
674000.00,5102000.00 674000.50,5102000.00 674001.00,5102000.00 674001.50,5102000.00 674002.00,5102000.00 674002.50,5102000.00 674003.00,5102000.00 …. 675000.00,5102000.00 пока первое число не будет равно +1000.00 (675000.00). Потом второе число увеличиваем на 0.5 а первое опять увеличиваем 674000.00,5102000.50 674000.50,5102000.50 674001.00,5102000.50 674001.50,5102000.50 674002.00,5102000.50 674002.50,5102000.50 674003.00,5102000.50 ….. 675000.00,5102000.50 И вот так пока конечное значение не достигнет по х и по у 675000.00,5103000.00 В данном шаге мы определяем параметры отбора. То есть ближайшая точка каждой строке и есть то что нам нужно т.е Выбирается точка с параметрами близкими к указанным.
Дано 674216.50,5102536.50 Самая подходящая точка из списка 674217.12,5102536.75,-25.62 674216.50,5102536.63,-25.61 вот эта 674215.88,5102536.52,-25.62 674215.26,5102536.40,-25.62
Трудность заключается в том, что нужно определить точность отбора. Если в строке есть, допустим точки с похожими параметрами то необходимо выбрать самую близкую. Возможно, необходимо задать деопозон от 0.01 до 0.49 Дано 674216.50,5102536.50 Из этих точек лучшая 674216.50,5102536.63,-25.61 674216.50,5102536.51,-25.61 вот эта 674216.54,5102536.63,-25.61 674216.60,5102536.50,-25.61 В приложенном файле примерно показано исходное положение точек и идеальное положение после фильтрации.
На форуме мне помогли с макросом который отбирал из списка точек, точки с определенным шагом. (спасибо Hugo) – Если кому то интересно вы можете почитать это тут. PageAlexander
Дано 674216.50,5102536.50 Из этих точек лучшая 674216.50,5102536.63,-25.61 674216.50,5102536.51,-25.61 вот эта
Всегда думал, что если одна координата одинаковая, то расстояние между точками рано разности другой координаты Ну или по Пифагору. А как здесь получается 25.61? Да и на фаил взглянуть бы. Может там и ексел не причём. Задаче какая? найти ближайшую к заданной? Зачем тогда перебирать все точки?
Цитата
Дано 674216.50,5102536.50 Из этих точек лучшая 674216.50,5102536.63,-25.61 674216.50,5102536.51,-25.61 вот эта
Всегда думал, что если одна координата одинаковая, то расстояние между точками рано разности другой координаты Ну или по Пифагору. А как здесь получается 25.61? Да и на фаил взглянуть бы. Может там и ексел не причём. Задаче какая? найти ближайшую к заданной? Зачем тогда перебирать все точки?alex77755
Простите это моя ошибка! я не показал полный формат строки 674216.50,5102536.63,-25.61 674216.50,5102536.51,-25.61 674216.54,5102536.63,-25.61 674216.60,5102536.50,-25.61 Это полный формат. Х,У,Z -25.... - это высотная отметка в с строке. мы работаем только с Х и У
alex77755, - задача найти ближайшую точку но не одну а множество. в приложенных картинках я попытался отобразить то что есть ( точки в живом виде) и то что должно получиться после обработки. То есть мы выбираем точки по заданным параметрам.
ikki, да это высотная отметка.
в файле ничего другого кроме как столбец приведенный выше нет. Задача - "ПРОРЕДИТЬ" точки. отобрать необходимые. должно получиться в итоге как сетка. могу в личку выслать часть файла - весь фаил весит много.
Простите это моя ошибка! я не показал полный формат строки 674216.50,5102536.63,-25.61 674216.50,5102536.51,-25.61 674216.54,5102536.63,-25.61 674216.60,5102536.50,-25.61 Это полный формат. Х,У,Z -25.... - это высотная отметка в с строке. мы работаем только с Х и У
alex77755, - задача найти ближайшую точку но не одну а множество. в приложенных картинках я попытался отобразить то что есть ( точки в живом виде) и то что должно получиться после обработки. То есть мы выбираем точки по заданным параметрам.
ikki, да это высотная отметка.
в файле ничего другого кроме как столбец приведенный выше нет. Задача - "ПРОРЕДИТЬ" точки. отобрать необходимые. должно получиться в итоге как сетка. могу в личку выслать часть файла - весь фаил весит много.Alexander
-25.... - это высотная отметка в с строке. мы работаем только с Х и У
Как-то непонятно задание тогда: Если мы работаем с координатами, то "То есть мы выбираем точки по заданным параметрам". Непонятно: данные в файле как-то упорядочены? Исходными данными являются координаты! При чём тогда высота? Расплывчатое задание
Цитата
-25.... - это высотная отметка в с строке. мы работаем только с Х и У
Как-то непонятно задание тогда: Если мы работаем с координатами, то "То есть мы выбираем точки по заданным параметрам". Непонятно: данные в файле как-то упорядочены? Исходными данными являются координаты! При чём тогда высота? Расплывчатое заданиеalex77755
Задача - "ПРОРЕДИТЬ" точки. отобрать необходимые. должно получиться в итоге как сетка.
Если проредить, то при чём координаты? Нужет чёткий формат файла и чёткий вопрос. Пока непонятно. Похоже, что данные в файле никак не упорядочены, а просто произвольный набор данных. Тогда в чём смысл? Какая основная задача?
Цитата
Задача - "ПРОРЕДИТЬ" точки. отобрать необходимые. должно получиться в итоге как сетка.
Если проредить, то при чём координаты? Нужет чёткий формат файла и чёткий вопрос. Пока непонятно. Похоже, что данные в файле никак не упорядочены, а просто произвольный набор данных. Тогда в чём смысл? Какая основная задача?alex77755
2- отбор строк будет производиться только по Х и У параметрам, последнее значение Z- высота нас не интересует она просто сотается в выбраной строке. 3-данные не упорядочены в файле. каждая строка это координаты точки. Вообще фаил это информация лазерного сканирования. то есть луч лазера замерял данные с определенной переодичностью. это можно сравнить с автоматной очередью. каждое отверстие это и есть точка ( строка X,Y,Z). но линия этих точек не идет по прямой а гуляет из стороны в сторону. еще раз постараюсь описать суть задачи Пример. - дано квадрат со сторонами 1х1 метр. в этом квадрате есть 100 точек разбросаных неравномерно. суть макроса отобрать из этих 100 точек всего 4 которые распологаются ближе всего к углам квадрата.
Сначала я думал что будет достаточно просто из списка выберать точки с определенным шагом. Hugo написал замечательный макрос который мне очень помог на начальном этапе. может быть его можно использовать как основу. Сейчас мне нужно два макроса для работы на территорию 1х1 км и для работы с выбранной территорией Вот макрос который отбирает точки с заданным шагом ( тут Mod =10 ) в пределах заданной территории. ( выделено красным) их можно менять.
[vba]
Код
Sub readtxt() Dim i&, ii&, x, strFilePath$, objTS Application.ScreenUpdating = False strFilePath = "C:\test.txt" Set objTS = CreateObject("Scripting.FileSystemObject").OpenTextFile(strFilePath, 1) Do Until objTS.AtEndOfStream x = Split(objTS.Readline, ",") If UBound(x) = 2 Then 'если в строке есть две запятые Select Case x(0) 'проверка первого числа [color=red]Case 683000 To 684000[/color] Select Case x(1) 'проверка второго числа [color=red]Case 5111000 To 5112000[/color] i = i + 1 If i Mod 10 = 0 Then 'выбираем каждое 8-е из прошедших проверку Application.StatusBar = "Read line " & i ii = ii + 1 Range(Cells(ii, 1), Cells(ii, 3)) = x End If End Select End Select End If Loop objTS.Close Set objTS = Nothing Application.StatusBar = False Application.ScreenUpdating = True End Sub
[/vba]
alex77755, 1- образец могу на почту выслать ( вот часть списка очень маленькая)
2- отбор строк будет производиться только по Х и У параметрам, последнее значение Z- высота нас не интересует она просто сотается в выбраной строке. 3-данные не упорядочены в файле. каждая строка это координаты точки. Вообще фаил это информация лазерного сканирования. то есть луч лазера замерял данные с определенной переодичностью. это можно сравнить с автоматной очередью. каждое отверстие это и есть точка ( строка X,Y,Z). но линия этих точек не идет по прямой а гуляет из стороны в сторону. еще раз постараюсь описать суть задачи Пример. - дано квадрат со сторонами 1х1 метр. в этом квадрате есть 100 точек разбросаных неравномерно. суть макроса отобрать из этих 100 точек всего 4 которые распологаются ближе всего к углам квадрата.
Сначала я думал что будет достаточно просто из списка выберать точки с определенным шагом. Hugo написал замечательный макрос который мне очень помог на начальном этапе. может быть его можно использовать как основу. Сейчас мне нужно два макроса для работы на территорию 1х1 км и для работы с выбранной территорией Вот макрос который отбирает точки с заданным шагом ( тут Mod =10 ) в пределах заданной территории. ( выделено красным) их можно менять.
[vba]
Код
Sub readtxt() Dim i&, ii&, x, strFilePath$, objTS Application.ScreenUpdating = False strFilePath = "C:\test.txt" Set objTS = CreateObject("Scripting.FileSystemObject").OpenTextFile(strFilePath, 1) Do Until objTS.AtEndOfStream x = Split(objTS.Readline, ",") If UBound(x) = 2 Then 'если в строке есть две запятые Select Case x(0) 'проверка первого числа [color=red]Case 683000 To 684000[/color] Select Case x(1) 'проверка второго числа [color=red]Case 5111000 To 5112000[/color] i = i + 1 If i Mod 10 = 0 Then 'выбираем каждое 8-е из прошедших проверку Application.StatusBar = "Read line " & i ii = ii + 1 Range(Cells(ii, 1), Cells(ii, 3)) = x End If End Select End Select End If Loop objTS.Close Set objTS = Nothing Application.StatusBar = False Application.ScreenUpdating = True End Sub
...суть макроса отобрать из этих 100 точек всего 4 которые распологаются ближе всего к углам квадрата...
Если понимать буквально,- просто сортируем список координат по Х и по У и каждый раз отбираем верхние 4 пары координат. Вроде как-то слишком просто, но м.б. так и нужно?
Цитата (Alexander)
...суть макроса отобрать из этих 100 точек всего 4 которые распологаются ближе всего к углам квадрата...
Если понимать буквально,- просто сортируем список координат по Х и по У и каждый раз отбираем верхние 4 пары координат. Вроде как-то слишком просто, но м.б. так и нужно?nilem
nilem, не совсем все так просто. про 100 точек и 4 по углам я написал для примера. в первом моем сообщении я более подробно расписал. берем исходную одну координату Х и увеличиваем ее на шаг "А" в арифметической прогрессии пока она не будет равна Х+1000 а потом берем координату У и => ..... У+1000 затем Х+"А" ; У=> ..... У+1000 то есть сначала разбиваем площадку на ровную сетку с шагом "А" ( это и есть параметры поиска) потом для каждой точки этой сетки с шагом "А" мы ищем точку из списка с погрешностью которую при желании можно изменить
Если в строке есть, допустим точки с похожими параметрами то необходимо выбрать самую близкую. Возможно, необходимо задать диапазон от 0.01 до 0.49 Исходная для поиска ( точка сетки ) 674216.50,5102536.50
Из этих точек лучшая 674216.50,5102536.63,-25.61 674216.50,5102536.51,-25.61 вот эта 674216.54,5102536.63,-25.61 674216.60,5102536.50,-25.61
ну вот как то так.
nilem, не совсем все так просто. про 100 точек и 4 по углам я написал для примера. в первом моем сообщении я более подробно расписал. берем исходную одну координату Х и увеличиваем ее на шаг "А" в арифметической прогрессии пока она не будет равна Х+1000 а потом берем координату У и => ..... У+1000 затем Х+"А" ; У=> ..... У+1000 то есть сначала разбиваем площадку на ровную сетку с шагом "А" ( это и есть параметры поиска) потом для каждой точки этой сетки с шагом "А" мы ищем точку из списка с погрешностью которую при желании можно изменить
Если в строке есть, допустим точки с похожими параметрами то необходимо выбрать самую близкую. Возможно, необходимо задать диапазон от 0.01 до 0.49 Исходная для поиска ( точка сетки ) 674216.50,5102536.50
Из этих точек лучшая 674216.50,5102536.63,-25.61 674216.50,5102536.51,-25.61 вот эта 674216.54,5102536.63,-25.61 674216.60,5102536.50,-25.61
Т.е. у Вас есть квадрат с хаотично (хаотически?) разбросанными точками, и Вам нужно убрать лишнее, чтобы оставшиеся точки представляли собой сетку (более-менее похожее на сетку) с определенным шагом. Так?
не знаю, как правильно: хаотично или хаотически? Можно так: с большой степенью энтропии
Т.е. у Вас есть квадрат с хаотично (хаотически?) разбросанными точками, и Вам нужно убрать лишнее, чтобы оставшиеся точки представляли собой сетку (более-менее похожее на сетку) с определенным шагом. Так?
не знаю, как правильно: хаотично или хаотически? Можно так: с большой степенью энтропии nilem
Яндекс.Деньги 4100159601573
Сообщение отредактировал nilem - Четверг, 17.01.2013, 14:08
а ближайшая к углу квадрата точка оценивается видимо как корень суммы квадратов разностей координат. Осталось только перебрать все сочетания для каждой точки "ровной сетки" в циклах.
а ближайшая к углу квадрата точка оценивается видимо как корень суммы квадратов разностей координат. Осталось только перебрать все сочетания для каждой точки "ровной сетки" в циклах.Ralf
Т.е. у Вас есть квадрат с хаотично (хаотически?) разбросанными точками, и Вам нужно убрать лишнее, чтобы оставшиеся точки представляли собой сетку (более-менее похожее на сетку) с определенным шагом. Так?
Именно так!!!!
Ralf, В терминалогии я не силен -
Цитата (Ralf)
Осталось только перебрать все сочетания для каждой точки "ровной сетки" в циклах.
именно так!!! и соблюсти точность отбора в границах указанных пользователем но не больше половины шага "А"
Кому интересно: в приложенной картинке две территории одного и того же файла при использовании макроса который я дал раньше. номер над квадратом это шаг отбора точек ( каждая 5 и 10) Как можно видеть, точки по поверхности распределяются не равномерно ( где гуще а где очень редко) квадрат со сторонами 250 х 205 метров. по этой причине я и решил попросить помощи на форуме.
nilem,
Цитата (nilem)
Т.е. у Вас есть квадрат с хаотично (хаотически?) разбросанными точками, и Вам нужно убрать лишнее, чтобы оставшиеся точки представляли собой сетку (более-менее похожее на сетку) с определенным шагом. Так?
Именно так!!!!
Ralf, В терминалогии я не силен -
Цитата (Ralf)
Осталось только перебрать все сочетания для каждой точки "ровной сетки" в циклах.
именно так!!! и соблюсти точность отбора в границах указанных пользователем но не больше половины шага "А"
Кому интересно: в приложенной картинке две территории одного и того же файла при использовании макроса который я дал раньше. номер над квадратом это шаг отбора точек ( каждая 5 и 10) Как можно видеть, точки по поверхности распределяются не равномерно ( где гуще а где очень редко) квадрат со сторонами 250 х 205 метров. по этой причине я и решил попросить помощи на форуме.Alexander
Ну вот, задачу сформулировали, алгоритм набросали, осталось только решить Нужны размеры вашего квадрата, шаг сетки и допустимое отклонение от "ровной сетки". И единицы измерения- метры? Наверное, осн. сложность - будут ли работать массивы с такими объемами. Залейте ваш файл (который 700 МБ) на файлообменник, а ссылку сюда.
Ну вот, задачу сформулировали, алгоритм набросали, осталось только решить Нужны размеры вашего квадрата, шаг сетки и допустимое отклонение от "ровной сетки". И единицы измерения- метры? Наверное, осн. сложность - будут ли работать массивы с такими объемами. Залейте ваш файл (который 700 МБ) на файлообменник, а ссылку сюда.nilem
nilem, как я уже говорил данные на квадрат 1х1 км.
в пути к файлу мы указываем координаты левого нижнего угла "C:\ 674000_5102000.txt" то есть левый нижний угол территории = 674000.00,5102000.00 следовательно верхний правый угол будет 675000.00,5103000.00 измерения в метрах
шаг сетки для начала пусть будет 0.5 метра
к сожалению фаил залить не могу причине корпоративной этики. часть файла размером 2-5 мб могу на почту отправить тому, кто будет заниматься. ну и соответственно сам буду макрос проверять на пользовательском уровне
nilem, как я уже говорил данные на квадрат 1х1 км.
в пути к файлу мы указываем координаты левого нижнего угла "C:\ 674000_5102000.txt" то есть левый нижний угол территории = 674000.00,5102000.00 следовательно верхний правый угол будет 675000.00,5103000.00 измерения в метрах
шаг сетки для начала пусть будет 0.5 метра
к сожалению фаил залить не могу причине корпоративной этики. часть файла размером 2-5 мб могу на почту отправить тому, кто будет заниматься. ну и соответственно сам буду макрос проверять на пользовательском уровне Alexander