Страница 1 из 4

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

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

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

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

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

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

Если хотите поизвращаться и сделать это в мапинфо без специальных утилит, то предлагаю следующий вариант: экспортируете полигональный слой в MIF (в нём будут содержаться атрибуты полигонов и координаты всех их точек), перекидываете MIF в эксель, и редактируете его там, нумеруете точки, потом в мапинфо ткрываете экселевский файл, строите точки по координатам, выводите с помощью функции подписывания номера точек. Подписи можно превратить в надписи этого же или другого слоя соответствующей стандартной утилитой.

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

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

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

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

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@
Спасибо за совет :D
Программа подписывает все узлы полигона, а мне именно это и надо!А вот с порядком нумерации проблема :(
Я новичок, не совсем понимаю ваши термины :( Не могли бы вы пояснить некоторые моменты :)
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:) Вы мне очень помогаете :D
Принцип нумерации:
Если в точке Centroid мысленно нарисовать Оси Ох и Оу, то в 4 четверти получится северо-запад. И узел близ лежащий к оси Ох, будет под номером 1. Нумерация по часовой стрелке.

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

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

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

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

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

Добавлено: 29 сен 2009, 14:47
Boris
Так помощь еще нужна или задача уже решена?

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

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

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. Выводим точки на экран с атрибутом - создав их путем геокодирования.