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

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

Добавлено: 30 сен 2009, 15:39
LEN@
Спасибо Вам большое Boris :D за подробный ответ!У меня все получилось :D

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

Добавлено: 30 сен 2009, 15:40
LEN@
Спасибо большое Boris :D У меня все получилось! :D

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

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

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

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

Добавлено: 01 окт 2009, 02:56
Boris
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. Геокодирование точек с выводом атрибута на экран. Геокодирование, потому, что я предложил в начале не создавать точек из вершин, только сохранять их координаты в таблицу - плоскую без геоинформации. С атрибутом - это потому, что я предложил присваивать новые номера точкам в процессе обхода и сохранять новый номер в атрибут.

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

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

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

Добавлено: 01 окт 2009, 16:57
Boris
Если знаете как получить координаты верхнего левого угла 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 - координаты вершины

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

Добавлено: 01 окт 2009, 17:03
Сергей1988
Спасибо большое Boris :D Я завтра попробу ю сделать все то что вы мне посоветовали!

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

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

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

Добавлено: 07 окт 2009, 20:48
Boris
Т.е. не получается выбрать 2-ю точку из двух возможных?
Или не получается правильно рассчитать новые номера?

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

Добавлено: 12 окт 2009, 19:58
Сергей1988
Спасибо за помощь :D Очень благодарен!

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

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

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

Выход:
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 При повторном запуске (например, если нужно расставить узлы для следующей таблицы участков, а узлы чтобы сохранялись в предыдущую) предлагается сохранить новые узлы в предыдущую таблицу с узлами и указать стартовый номер (можно согласиться с предложенным); текстовые файлы также продолжаются.

Составные полигоны тоже обрабатываются.
Возможны ошибки.

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

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

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

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

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

Добавлено: 22 май 2014, 07:11
ginpetr
Немного изменил:
Теперь только один текстовый файл, площади участков округляются до целых, длины до сотых, углы в г-м-с и измерения производятся на плоскости.

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

Добавлено: 29 май 2014, 07:06
ginpetr
dab, ещё вопрос.
Координаты X и Y для АИС ГКН менять местами нужно? если да, то зачем?