Нумерация узлов начиная с северо-западного угла

MapInfo, MapBasic
LEN@
Интересующийся
Сообщения: 21
Зарегистрирован: 31 авг 2009, 18:02
Репутация: 0

Нумерация узлов начиная с северо-западного угла

Сообщение LEN@ » 31 авг 2009, 19:06

Всем ПРИВЕТ!Помогите новичку :D
Суть в следующем: Создаем объект типа область, нумеруем узлы данной области, начиная с северо-западного угла. Причем полученные координаты и номера узлов должны записываться в таблицу.

Заранее спасибо :D

Аватара пользователя
SS_Rebelious
Гуру
Сообщения: 1304
Зарегистрирован: 24 фев 2009, 16:51
Репутация: 99
Ваше звание: GIS pro-fan
Откуда: Lahti / Газ-ПУТИНбург
Контактная информация:

Re: Нумерация узлов начиная с северо-западного угла

Сообщение SS_Rebelious » 31 авг 2009, 20:42

А для каких целей Вам это надо? Уж не для землеустроительных ли дел? Если так, то не стоит мучиться - воспользуйтесь сторонним софтом: ТехноКад-Редактор (бесплатная программа для составления межевого плана доступна на сайте роснедвижимости, нумерует точки полигона из MIF/MID и сразу составляет межевой план) или MapInfo Tools (это уже за умеренную плату - подписывает точки прямо в мапинфо).

Если же я ошибся, и это никакой не кадастр и вообще разовая работа, то тогда опять же воспользуйтесь MapInfo Tools - месяц прога работает бесплатно.

Если хотите поизвращаться и сделать это в мапинфо без специальных утилит, то предлагаю следующий вариант: экспортируете полигональный слой в MIF (в нём будут содержаться атрибуты полигонов и координаты всех их точек), перекидываете MIF в эксель, и редактируете его там, нумеруете точки, потом в мапинфо ткрываете экселевский файл, строите точки по координатам, выводите с помощью функции подписывания номера точек. Подписи можно превратить в надписи этого же или другого слоя соответствующей стандартной утилитой.
Look for something long enough, and you will find it. Look for something without understanding, and it will find you...
"All paid jobs absorb and degrade the mind." Aristotle
If you take 1 step towards freedom it'll take 2 steps towards you!

LEN@
Интересующийся
Сообщения: 21
Зарегистрирован: 31 авг 2009, 18:02
Репутация: 0

Re: Нумерация узлов начиная с северо-западного угла

Сообщение LEN@ » 05 сен 2009, 19:40

Спасибо зас совет :D
Но мне нужно разработать утилиту именно в MapInfo.
Программа у меня считает количество узлов, причем определяет их правильно, но когда я в For...Next пытаюсь узнать координаты каждого узла, то он видет только один указанный а подставляемую переменную игнорирует и счетчик не видит, выдает ошибку :(

LEN@
Интересующийся
Сообщения: 21
Зарегистрирован: 31 авг 2009, 18:02
Репутация: 0

Re: Нумерация узлов начиная с северо-западного угла

Сообщение LEN@ » 23 сен 2009, 17:57

Добрый вечер :D
Посоветуйте как можно пронумеровать узлы(написать условие в цикле), начиная с северо-запада?
Программа у меня определяет координаты каждого узла, прорисовывает точки, а вот с нумерацией как-то не заладилось :(
Подскажите, пожалуйста :D

Аватара пользователя
SS_Rebelious
Гуру
Сообщения: 1304
Зарегистрирован: 24 фев 2009, 16:51
Репутация: 99
Ваше звание: GIS pro-fan
Откуда: Lahti / Газ-ПУТИНбург
Контактная информация:

Re: Нумерация узлов начиная с северо-западного угла

Сообщение SS_Rebelious » 23 сен 2009, 19:35

Думаю, если Вы выложите код, то быть может, знающие люди подскажут в чём проблема.
Look for something long enough, and you will find it. Look for something without understanding, and it will find you...
"All paid jobs absorb and degrade the mind." Aristotle
If you take 1 step towards freedom it'll take 2 steps towards you!

LEN@
Интересующийся
Сообщения: 21
Зарегистрирован: 31 авг 2009, 18:02
Репутация: 0

Re: Нумерация узлов начиная с северо-западного угла

Сообщение LEN@ » 23 сен 2009, 19:44

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
Последний раз редактировалось LEN@ 24 сен 2009, 19:04, всего редактировалось 1 раз.

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: Нумерация узлов начиная с северо-западного угла

Сообщение Boris » 24 сен 2009, 12:52

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. Построить выходную таблицу надписей или точек с подписями.

LEN@
Интересующийся
Сообщения: 21
Зарегистрирован: 31 авг 2009, 18:02
Репутация: 0

Re: Нумерация узлов начиная с северо-западного угла

Сообщение LEN@ » 24 сен 2009, 18:03

Спасибо за совет :D
Программа подписывает все узлы полигона, а мне именно это и надо!А вот с порядком нумерации проблема :(
Я новичок, не совсем понимаю ваши термины :( Не могли бы вы пояснить некоторые моменты :)
1. "Обойти исходную таблицу", "развернуть" все вершины?
2. Каким образом можно обойти все записи запроса и присвоить номера?
Принцип нумерации:
Я предполагала, что можно осуществить нумерацию относительно Centroid объекта.

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: Нумерация узлов начиная с северо-западного угла

Сообщение Boris » 24 сен 2009, 21:21

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=количеству строк.
Принцип нумерации:
Теперь я вас не понял. Северо-западный угол - это угол с наименьшими координатами? Так вы один объект нумеруете? И что в этом случае дает центроид? Или вы хотите их нумеровать в порядке их соединения, но начав в узла с минимальными координатами? А в какую сторону? По кругу или против?
Представьте себе треугольник. Как вы его хотите нумеровать? А кремлевскую звезду?

LEN@
Интересующийся
Сообщения: 21
Зарегистрирован: 31 авг 2009, 18:02
Репутация: 0

Re: Нумерация узлов начиная с северо-западного угла

Сообщение LEN@ » 26 сен 2009, 17:10

Спасибо большое Boris:) Вы мне очень помогаете :D
Принцип нумерации:
Если в точке Centroid мысленно нарисовать Оси Ох и Оу, то в 4 четверти получится северо-запад. И узел близ лежащий к оси Ох, будет под номером 1. Нумерация по часовой стрелке.

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: Нумерация узлов начиная с северо-западного угла

Сообщение Boris » 28 сен 2009, 01:00

У вас что всего 4 узла? Самый северо-западный будет тот, который имеет максимальную близость к верхнему левому углу MBR (минимальный описывающий прямоугольник). Причем не факт, что центр этого MBR будет совпадать с центроидом.
Вы не пояснили принципа дальнейшей работы - следующий узел - это примыкающий к первому выбранному в направлении часовой стрелки или любой другой, который просто ближе к углу MBR, чем 1-ый.
Другими словами - задача сводится ли к выбору первого узла и направления обхода или нет?

LEN@
Интересующийся
Сообщения: 21
Зарегистрирован: 31 авг 2009, 18:02
Репутация: 0

Re: Нумерация узлов начиная с северо-западного угла

Сообщение LEN@ » 28 сен 2009, 15:43

Земельный участок имеет большое количество узлов,т.к. он не ровный. Нумеровать нужно узел, который находится ближе всего к оси Ох. Центроид и не должен совпадать с центром участка.
А следующий узел - это примыкающий к первому выбранному в направлении часовой стрелки.
Как вы , Boris,правильно заметили :D - задача сводится к выбору первого узла и направления обхода по часовой стрелки!

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: Нумерация узлов начиная с северо-западного угла

Сообщение Boris » 29 сен 2009, 14:47

Так помощь еще нужна или задача уже решена?

LEN@
Интересующийся
Сообщения: 21
Зарегистрирован: 31 авг 2009, 18:02
Репутация: 0

Re: Нумерация узлов начиная с северо-западного угла

Сообщение LEN@ » 29 сен 2009, 16:56

Под вашим четким руководством Boris у меня получилось составить задачу, за что большое спасибо :D
Все основные функции она выполняет, вот толькос нумерацией разобраться не могу :(
Программа считывает координаты узлов, добавляет узлы, сохраняет координаты в таблицу, нумерует, но не так как мне надо :(
Помогите пожалуйста :D Чтобы он не только выбирал первый узел, но и продолжал нумерацию по кругу, по часовой стрелке. Первый узел программа выбирает, а дальше зацикливается, не знаю как записать условие. Подскажите, если можете!!!

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: Нумерация узлов начиная с северо-западного угла

Сообщение Boris » 29 сен 2009, 17:18

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

Ответить

Вернуться в «MapInfo»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей