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

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

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

Сообщение LEN@ » 30 сен 2009, 15:39

Спасибо Вам большое Boris :D за подробный ответ!У меня все получилось :D

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

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

Сообщение LEN@ » 30 сен 2009, 15:40

Спасибо большое Boris :D У меня все получилось! :D

Сергей1988
Интересующийся
Сообщения: 32
Зарегистрирован: 30 сен 2009, 15:50
Репутация: 0

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

Сообщение Сергей1988 » 30 сен 2009, 15:58

Доброго времени суток :D
Меня тоже интересует эта тема!
Boris, я в программировании совсем недавно. По работе пришлось столкнуться. Поясните некоторые моменты по подробнее. Мне не совсем понятны
3. Запросом найдем номер точки, у которой наименьший (x-min(x))**2+(y-max(y))**2 - это будет точка начала
4. Теперь мы знаем ее номер - надо исследовать точки с соседними номерами +1 и -1
5. Теперь находим угол между начальной точкой каждой из ее соседей относительно центроида MBR.

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

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

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

Сообщение Boris » 01 окт 2009, 02:56

MBR = minimal boundary rectange - минимальный описывающий (геообъект) прямоугольник (в текущей системе координат).
3. В той записи min(x) - наименьшая из всех координат по x, соотвественно max(y) - наибольшая из всех координат по y. x,y не обязательно принадлежат одной и той же точке. Для меня это простейший способ указать, что такое северо-западный угол. Иначе придется изобретать какую-то другую формулировку. Поскольку MBR - получается для любого объекта функцией MapBsic'а (МВ) - MBR(obj) - для меня это простейший случай. Этого левый верхний угол и будет этим самым ((mix(x),max(y)). Видимо как получить из полигона точки - вы уже знаете. В моей рекомендации точки сохранялись в новую таблицу, при которых сохранялись а) координаты x,y б) номер вершины в исходном многоугольнике.
(x-min(x))**2+(y-max(y))**2 - это квадрат расстояния от любой точки (вершины) до точки ((mix(x),max(y)) - лев-верх угла MBR. Соответственно, точку, у которой это расстояние минимально следует считать самой близкой к лев-верх углу MBR. В моей формулировке - это и есть самая лев-верх точка многоугольника. Наверное есть какая-то другая формулировка того, что следует считать самой лев-верх точкой многоугольника, может быть этому есть даже какое-то официальное толкование. Я его просто не знаю и предложил его исходя из своего здравого смысла :)
4. В п.3 мы выбирали начальную точку. Это и будет наша точка 1. Исходя из формулировки задачи, как ее уточнила автор вопроса, обход вершин следует выполнять строго в порядке их смежности и в направлении по часовой стрелке. Это будут точки с номерами (в исходном многоугольнике) +1 и -1 к выбранной нами точке начала. Крайние варианты - это если точка начала оказалась начальной или конечной точкой многоугольника. Но все равно, в замкнутом множестве, где после точки с максимальным номером следует точка с наименьшим - это точки +-1. И координаты относительно исходной точки и будем исследовать.
5. Угол по часовой стрелке - он ведь не относительно начала координат, а относительно чего-то, что связано с нашим геометрическим объектом - многоугольником. Т.е. относительно некоторой внутренней точки этого многоугольника. Что бы не множить сложности, я посчитал, что это может быть центр, рассмотренной выше MBR. Centroid(obj) - может быть с тем же успехом. И та и другая точки легко рассчитываются, и для всех выпуклых многоугольников лежат внутри объекта, для большинства других - то же, но тут возможны варианты. Для тех случаев, когда они лежат вне объектов и любые другие предположения будут гораздо труднее рассчитать и алгоритмизировать. Но возможно, что Centroid() - надежней, т.к. если его не двигали, он всегда лежит внутри объекта. Алгоритм нахождения угла между двумя отрезками я так сразу не припомню, но он должен быть какой-то очевидный - что вроде произведения векторов(?).
6. В любом случае нам нужен не просто угол, а именно угол со знаком, т.к. знак и задает направление. Если я верно помню начальную тригонометрию, то по часовой стрелке - это угол как раз отрицательный. Узнав какая это точка +1 или -1 - мы получаем знак направления обхода.
7. К этому моменту мы имеем - номер начальной точки в исходной нумерации вершин = M, и приращение точек в направлении по часовой стрелке +1 или -1, в любом случае, для нас это k. Теперь точка N, В новой системе нумерации точек (выводимой на экран и сохраняемой нами в атрибуте) -> 1, точка N+k -> 2 или для точки i в старой системе нумерации вершин i -> ((i-N)*k) Mod Max(i-1), т.е. число ((i-N)*k) по модулю (общее кол-во вершин минус один). Минус один, т.к. в многоугольнике, когда он задает Region начальная точка дублируется как первая и последняя. И эту точку надо было игнорировать еще на этапе разбора многоугольника на вершины.
8. Геокодирование точек с выводом атрибута на экран. Геокодирование, потому, что я предложил в начале не создавать точек из вершин, только сохранять их координаты в таблицу - плоскую без геоинформации. С атрибутом - это потому, что я предложил присваивать новые номера точкам в процессе обхода и сохранять новый номер в атрибут.

Сергей1988
Интересующийся
Сообщения: 32
Зарегистрирован: 30 сен 2009, 15:50
Репутация: 0

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

Сообщение Сергей1988 » 01 окт 2009, 15:47

Спасибо Boris за подробный ответ!
Только я не знаю с помощью каких операторов можно выбрать минимальное расстояние, т.е. выбрать узел с наименьшей координатой(вершину с №1)

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

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

Сообщение Boris » 01 окт 2009, 16:57

Если знаете как получить координаты верхнего левого угла MBR(xM;yM), а точки сохранены в таблицу MI, то должен сработать запрос
select id1,(x-xM)*(x-xM)+(y-yM)*(y-yM) order by (x-xM)*(x-xM)+(y-yM)*(y-yM) - первая точка результатах этого запроса и будет искомой.
id1 - номер вершины
x,y - координаты вершины

Сергей1988
Интересующийся
Сообщения: 32
Зарегистрирован: 30 сен 2009, 15:50
Репутация: 0

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

Сообщение Сергей1988 » 01 окт 2009, 17:03

Спасибо большое Boris :D Я завтра попробу ю сделать все то что вы мне посоветовали!

Сергей1988
Интересующийся
Сообщения: 32
Зарегистрирован: 30 сен 2009, 15:50
Репутация: 0

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

Сообщение Сергей1988 » 07 окт 2009, 18:19

Доброго времени суток :D
Boris,можно побеспокойть Вас еще раз? У меня не совсем получается задать направление нумерации. Т.е. первую точку я нахожу, выбираю, присваиваю номер1, а дальше нумерация идет как при создании первой таблицы.
Подскажите, как можно более грамотно написать условие?
______________________________________________________________
Заранее спасибо :D

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

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

Сообщение Boris » 07 окт 2009, 20:48

Т.е. не получается выбрать 2-ю точку из двух возможных?
Или не получается правильно рассчитать новые номера?
Вложения
Угол между граньюAB и осью X.doc
Вот полный ответ:
(102 КБ) 703 скачивания

Сергей1988
Интересующийся
Сообщения: 32
Зарегистрирован: 30 сен 2009, 15:50
Репутация: 0

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

Сообщение Сергей1988 » 12 окт 2009, 19:58

Спасибо за помощь :D Очень благодарен!

Аватара пользователя
ginpetr
Завсегдатай
Сообщения: 385
Зарегистрирован: 21 июн 2011, 12:07
Репутация: 140
Откуда: Орск
Контактная информация:

ведомость координат поворотных точек

Сообщение ginpetr » 16 май 2014, 08:57

Приступили к разработке проектов планировок с проектами межевания и в последних как раз появилась необходимость расстановки узлов земельных участков ИЖС. Особенности такие: участков несколько сотен, узлов больше тысячи, большинство смежные (имеют общие узлы) и нужно чтоб узлы не дублировались, необходимо составить ведомость координат по участкам.
Пришлось писать утилиту. Результат предлагаю Вашему вниманию.

Исходные данные:
Таблицы с полигонами и целочисленной колонкой.

Выход:
1. Таблица с объектами-точками и номерами точек, порядковыми номерами участков, координатами в семантике
2. Текстовый документ с данными по участкам (ведомость координат поворотных точек) для редактирования в Экселе с разделителями ";"

Порядок работы:
1.Нумеруем участки вручную (если командой обновить колонку невозможно по каким-либо причинам)
1.1 Выбираем таблицу в списке таблиц
1.2 нажимаем на кнопку №1(слева направо на картинке) и выбираем целочисленное поле и указываем начальный номер участка - OK
1.3 инструментом (кнопка №2) указываем в нужном порядке участки, порядковые номера записываются в указанное поле, одно нажатие увеличивает счётчик на единицу; в случае ошибки можно нажать кнопку №1 и, изменив стартовый номер, продолжить нумерацию.(для контроля следует включить подписи по этому полю)
2. Запрашиваем участки с упорядочиванием по номерам (или иным данным, тогда пункт 1 можно пропустить)
3. Запускаем расстановку и нумерацию узлов нажатием на кнопку №3
3.1 Предлагается выбрать куда сохранить таблицу с точками
3.2 Предлагается выбрать номер первого узла
3.3 Предлагается выбрать поле для подписи участков в выходных текстовых файлах (при отказе подписываются порядковыми номерами)
3.4 При повторном запуске (например, если нужно расставить узлы для следующей таблицы участков, а узлы чтобы сохранялись в предыдущую) предлагается сохранить новые узлы в предыдущую таблицу с узлами и указать стартовый номер (можно согласиться с предложенным); текстовые файлы также продолжаются.

Составные полигоны тоже обрабатываются.
Возможны ошибки.
Вложения
UTP.zip
инструмент
(4.88 КБ) 460 скачиваний
панель.png
кнопки
панель.png (1.95 КБ) 11585 просмотров
Последний раз редактировалось ginpetr 23 май 2014, 10:41, всего редактировалось 3 раза.

Аватара пользователя
ginpetr
Завсегдатай
Сообщения: 385
Зарегистрирован: 21 июн 2011, 12:07
Репутация: 140
Откуда: Орск
Контактная информация:

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

Сообщение ginpetr » 21 май 2014, 12:00

Нет комментариев к инструменту?
В настоящий момент пытаюсь учесть требования к формату представления координат, длин, углов... округления до скольки знаков и всё такое.
Кто-нибудь знает, как правильно производить измерения площади и длин сторон земельных участков - в плане или на сфере?
И вообще зачем два вида измерения? (сколько работаю, до сих пор не знаю...)

Аватара пользователя
dab
Гуру
Сообщения: 671
Зарегистрирован: 16 дек 2011, 20:02
Репутация: 170
Ваше звание: Гуру
Откуда: Москва
Контактная информация:

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

Сообщение dab » 21 май 2014, 14:12

ginpetr писал(а):Кто-нибудь знает, как правильно производить измерения площади и длин сторон земельных участков - в плане или на сфере?
И вообще зачем два вида измерения? (сколько работаю, до сих пор не знаю...)
"Правильно" зависит от решаемой задачи.
Если нужно посчитать фактическую площадь лесов Красноярского края - тогда на сфере, так как территория огромная, а Земля круглая.
Если нужно посчитать площадь земельного участка для регистрации - тогда на плоскости, так как АИС ГКН считает на плоскости.

Аватара пользователя
ginpetr
Завсегдатай
Сообщения: 385
Зарегистрирован: 21 июн 2011, 12:07
Репутация: 140
Откуда: Орск
Контактная информация:

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

Сообщение ginpetr » 22 май 2014, 07:11

Немного изменил:
Теперь только один текстовый файл, площади участков округляются до целых, длины до сотых, углы в г-м-с и измерения производятся на плоскости.
Вложения
UTP.zip
от 22.05.14
(4.82 КБ) 512 скачиваний

Аватара пользователя
ginpetr
Завсегдатай
Сообщения: 385
Зарегистрирован: 21 июн 2011, 12:07
Репутация: 140
Откуда: Орск
Контактная информация:

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

Сообщение ginpetr » 29 май 2014, 07:06

dab, ещё вопрос.
Координаты X и Y для АИС ГКН менять местами нужно? если да, то зачем?

Ответить

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

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

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