Страница 1 из 4
Нумерация узлов начиная с северо-западного угла
Добавлено: 31 авг 2009, 19:06
LEN@
Всем ПРИВЕТ!Помогите новичку
Суть в следующем: Создаем объект типа область, нумеруем узлы данной области, начиная с северо-западного угла. Причем полученные координаты и номера узлов должны записываться в таблицу.
Заранее спасибо

Re: Нумерация узлов начиная с северо-западного угла
Добавлено: 31 авг 2009, 20:42
SS_Rebelious
А для каких целей Вам это надо? Уж не для землеустроительных ли дел? Если так, то не стоит мучиться - воспользуйтесь сторонним софтом: ТехноКад-Редактор (бесплатная программа для составления межевого плана доступна на сайте роснедвижимости, нумерует точки полигона из MIF/MID и сразу составляет межевой план) или MapInfo Tools (это уже за умеренную плату - подписывает точки прямо в мапинфо).
Если же я ошибся, и это никакой не кадастр и вообще разовая работа, то тогда опять же воспользуйтесь MapInfo Tools - месяц прога работает бесплатно.
Если хотите поизвращаться и сделать это в мапинфо без специальных утилит, то предлагаю следующий вариант: экспортируете полигональный слой в MIF (в нём будут содержаться атрибуты полигонов и координаты всех их точек), перекидываете MIF в эксель, и редактируете его там, нумеруете точки, потом в мапинфо ткрываете экселевский файл, строите точки по координатам, выводите с помощью функции подписывания номера точек. Подписи можно превратить в надписи этого же или другого слоя соответствующей стандартной утилитой.
Re: Нумерация узлов начиная с северо-западного угла
Добавлено: 05 сен 2009, 19:40
LEN@
Спасибо зас совет
Но мне нужно разработать утилиту именно в MapInfo.
Программа у меня считает количество узлов, причем определяет их правильно, но когда я в For...Next пытаюсь узнать координаты каждого узла, то он видет только один указанный а подставляемую переменную игнорирует и счетчик не видит, выдает ошибку

Re: Нумерация узлов начиная с северо-западного угла
Добавлено: 23 сен 2009, 17:57
LEN@
Добрый вечер
Посоветуйте как можно пронумеровать узлы(написать условие в цикле), начиная с северо-запада?
Программа у меня определяет координаты каждого узла, прорисовывает точки, а вот с нумерацией как-то не заладилось
Подскажите, пожалуйста

Re: Нумерация узлов начиная с северо-западного угла
Добавлено: 23 сен 2009, 19:35
SS_Rebelious
Думаю, если Вы выложите код, то быть может, знающие люди подскажут в чём проблема.
Re: Нумерация узлов начиная с северо-западного угла
Добавлено: 23 сен 2009, 19:44
LEN@
x1 = CentroidX(Selection.obj)
y1 = CentroidY(Selection.obj)
If object_name = "Region" Then
' ... тогда объект - полигон...
For i=1 to (counter-1)
x = ObjectNodeX(Selection.obj, 1, i) ' чтение долготы
y = ObjectNodeY(Selection.obj, 1, i) ' чтение широты
Create Point Into Variable new_pnt (x, y)
Insert Into Selection (obj) Values (new_pnt)
If (x<x1) and (y<y1) Then
i_map_id=FrontWindow()
Insert Into Cosmetic1 (Obj)
Values ( CreateText(i_map_id, x, y, "N"+i, 0,1,0) )
End If
Next
End If
Re: Нумерация узлов начиная с северо-западного угла
Добавлено: 24 сен 2009, 12:52
Boris
If object_name = "Region" Then
' ... тогда объект - полилиния...
это точно не полиния - это полигон.
Не видно, что бы была установлена внутренняя система координат.
Вставлять в Selection - нельзя. Результат не предсказуем.
Точки обычно подписывают как атрибуты, а не как временные подписи.
И самое главное, приведенный текст программы не имеет к цели отношения, поскольку подписывает только отдельные точки, а не все.
---
Решение задачи:
1. создать таблицу, можно НЕгеографическую, с тремя полями - номер, коррдинаты X,Y
2. обойти исходную таблицу полилиний/полигонов, "развернуть" все вершины объектов в отдельные точки
3. сохранить координаты точек (или сами точки) - это как удобней, в НОВУЮ НЕкосметическую таблицу
4. по окончании - сохранить таблицу точек. В идеале - сжать ее.
5. открыть запрос к таблице точек, отсортированный по координатам XY. Вы не сказали принцип нумерации от северо-запада. Это минимум расстояния от угла или какой еще минимум? Если минимум расстояния, то сортировка выполняется по (x-x1)*(x-x1)+(y-y1)*(y-y1), где X,y - это координаты текущей точки, x1,y1 - координаты нижнего угла или точки с минимальной суммой квадратов по x,y
6. В цикле или запросом обойти все записи запроса и присвоить порядковые номера точкам.
7. Построить выходную таблицу надписей или точек с подписями.
Re: Нумерация узлов начиная с северо-западного угла
Добавлено: 24 сен 2009, 18:03
LEN@
Спасибо за совет
Программа подписывает все узлы полигона, а мне именно это и надо!А вот с порядком нумерации проблема
Я новичок, не совсем понимаю ваши термины

Не могли бы вы пояснить некоторые моменты
1. "Обойти исходную таблицу", "развернуть" все вершины?
2. Каким образом можно обойти все записи запроса и присвоить номера?
Принцип нумерации:
Я предполагала, что можно осуществить нумерацию относительно Centroid объекта.
Re: Нумерация узлов начиная с северо-западного угла
Добавлено: 24 сен 2009, 21:21
Boris
1. Я ведь не знаю сколько объектов вы обрабатывает. Обычно в MI работаю с таблицей, даже если это запрос или выборка Selection. Поэтому я предположил, что вы это делаете на наборе объектов, собранных (или отобранных) в таблицу, даже если это запрос, состоящий из одного объекта. Этому и повещено, что "надо" развернуть все вершины - в том смысле, что из одного объекта "полилиния" или "полигон" получить набор точек, расположенных в его вершинах. Один объект "разворачивается" в "набор точек".
2. Таблицу обходят командами fetch
Код: Выделить всё
Dim i As Integer
i = 0
Fetch First From world
Do While Not EOT(world)
i = i + 1
Fetch Next From world
Loop
Обновляют командами Update
Update table Set column = expr [, column = expr, ...]
[ Where RowID = idnum ]
Для упакованных таблиц команда
Update table Set column = rowID присваивает номера в порядке от 1 до N=количеству строк.
Принцип нумерации:
Теперь я вас не понял. Северо-западный угол - это угол с наименьшими координатами? Так вы один объект нумеруете? И что в этом случае дает центроид? Или вы хотите их нумеровать в порядке их соединения, но начав в узла с минимальными координатами? А в какую сторону? По кругу или против?
Представьте себе треугольник. Как вы его хотите нумеровать? А кремлевскую звезду?
Re: Нумерация узлов начиная с северо-западного угла
Добавлено: 26 сен 2009, 17:10
LEN@
Спасибо большое Boris:) Вы мне очень помогаете
Принцип нумерации:
Если в точке Centroid мысленно нарисовать Оси Ох и Оу, то в 4 четверти получится северо-запад. И узел близ лежащий к оси Ох, будет под номером 1. Нумерация по часовой стрелке.
Re: Нумерация узлов начиная с северо-западного угла
Добавлено: 28 сен 2009, 01:00
Boris
У вас что всего 4 узла? Самый северо-западный будет тот, который имеет максимальную близость к верхнему левому углу MBR (минимальный описывающий прямоугольник). Причем не факт, что центр этого MBR будет совпадать с центроидом.
Вы не пояснили принципа дальнейшей работы - следующий узел - это примыкающий к первому выбранному в направлении часовой стрелки или любой другой, который просто ближе к углу MBR, чем 1-ый.
Другими словами - задача сводится ли к выбору первого узла и направления обхода или нет?
Re: Нумерация узлов начиная с северо-западного угла
Добавлено: 28 сен 2009, 15:43
LEN@
Земельный участок имеет большое количество узлов,т.к. он не ровный. Нумеровать нужно узел, который находится ближе всего к оси Ох. Центроид и не должен совпадать с центром участка.
А следующий узел - это примыкающий к первому выбранному в направлении часовой стрелки.
Как вы , Boris,правильно заметили

- задача сводится к выбору первого узла и направления обхода по часовой стрелки!
Re: Нумерация узлов начиная с северо-западного угла
Добавлено: 29 сен 2009, 14:47
Boris
Так помощь еще нужна или задача уже решена?
Re: Нумерация узлов начиная с северо-западного угла
Добавлено: 29 сен 2009, 16:56
LEN@
Под вашим четким руководством Boris у меня получилось составить задачу, за что большое спасибо
Все основные функции она выполняет, вот толькос нумерацией разобраться не могу
Программа считывает координаты узлов, добавляет узлы, сохраняет координаты в таблицу, нумерует, но не так как мне надо
Помогите пожалуйста

Чтобы он не только выбирал первый узел, но и продолжал нумерацию по кругу, по часовой стрелке. Первый узел программа выбирает, а дальше зацикливается, не знаю как записать условие. Подскажите, если можете!!!
Re: Нумерация узлов начиная с северо-западного угла
Добавлено: 29 сен 2009, 17:18
Boris
Я думаю, что что-то не так у нас в терминах. Подписать узлы сами по себе можно только создав либо точечный объект с атрибутом номер, либо создав в окне надписи. Первый вариант - мне кажется более разумным, в силу своей алгоритмической очевидности. Задача, по моему решается в несколько проходов:
1. Надо получить координаты всех вершин многоугольника. И эти координаты, плюс номер, от начала сохранить в новую таблицу MI.
2. Теперь надо найти точку с наименьшим расстоянием от левого верхнего угла MBR - координата для MBR = (mix(x);max(y)) - расстояние по теореме Пифагора (x-min(x))**2+(y-max(y))**2 - это значение так же стоит записать в новую таблицу в качестве атрибута
3. Запросом найдем номер точки, у которой наименьший (x-min(x))**2+(y-max(y))**2 - это будет точка начала
4. Теперь мы знаем ее номер - надо исследовать точки с соседними номерами +1 и -1
5. Теперь находим угол между начальной точкой каждой из ее соседей относительно центроида MBR.
6. Точка с отрицательным углом - и будет следующей точной в нумерации.
7. Исходя из направления вычисляем приращение +1 или -1 - исходя из этого создаем новые номера всем точкам.
8. Выводим точки на экран с атрибутом - создав их путем геокодирования.