Как поменять местами X и Y в полигональном слое?

Вопросы по нескольким пакетам сразу, или вопросы, которые непонятно к какой ГИС отнести
kryl
Завсегдатай
Сообщения: 324
Зарегистрирован: 14 фев 2010, 20:42
Репутация: 0

Как поменять местами X и Y в полигональном слое?

Сообщение kryl » 22 сен 2010, 08:56

Есть полигональный слой в DD. В нем перепутан X и Y. Как это можно исправить? По сути нужно отразить (Mirror) относительно оси ((0,0) (1,1)) только никак не соображу как это сделать кроме как в AutoCAD. Может prj какой нибудь хитрый написать?

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Как поменять местами X и Y в полигональном слое?

Сообщение Александр Мурый » 22 сен 2010, 22:35

Можно в GRASS (координаты в примере прямоугольные, XY):
2010-09-22-232218_1022x717_scrot.png
2010-09-22-232218_1022x717_scrot.png (9.74 КБ) 15231 просмотр
Аттрибуты точек слева (номер точки, x, y):
v.db.select XY_vertex layer=2

Код: Выделить всё

cat|x|y
1|195.020747|929.460581
2|396.26556|668.049793
3|313.278008|454.356846
4|375.518672|381.742739
5|437.759336|410.788382
6|570.539419|531.120332
7|493.775934|844.39834
8|284.232365|962.655602
9|195.020747|929.460581
Аттрибуты точек справа (номер точки, x, y):
v.db.select YX_vertex

Код: Выделить всё

cat|x|y
1|929.460581|195.020747
2|668.049793|396.26556
3|454.356846|313.278008
4|381.742739|375.518672
5|410.788382|437.759336
6|531.120332|570.539419
7|844.39834|493.775934
8|962.655602|284.232365
9|929.460581|195.020747
Если нужно, могу описать сам процесс.
Редактор материалов, модератор форума

kryl
Завсегдатай
Сообщения: 324
Зарегистрирован: 14 фев 2010, 20:42
Репутация: 0

Re: Как поменять местами X и Y в полигональном слое?

Сообщение kryl » 23 сен 2010, 07:59

Был бы крайне признателен!

Saimon
Завсегдатай
Сообщения: 478
Зарегистрирован: 25 фев 2009, 09:00
Репутация: 14
Откуда: Новороссийск-Краснодар-Москва

Re: Как поменять местами X и Y в полигональном слое?

Сообщение Saimon » 23 сен 2010, 10:27

А Вы не пробовали это сделать в QGIS??
Модули-Geoprocessing-Affine(Rotation, Translation, Scale)
Вложения
transformation.jpg
transformation.jpg (50.33 КБ) 15210 просмотров

kryl
Завсегдатай
Сообщения: 324
Зарегистрирован: 14 фев 2010, 20:42
Репутация: 0

Re: Как поменять местами X и Y в полигональном слое?

Сообщение kryl » 23 сен 2010, 11:50

Я думал над этим модулем, но не смог сообразить, какие нужно забить параметры чтобы добиться требуемого эффекта. И можно ли с его помощью вообще сделать Mirror т. к. математику аффинного преобразования представляю себе весьма приблизительно.

Saimon
Завсегдатай
Сообщения: 478
Зарегистрирован: 25 фев 2009, 09:00
Репутация: 14
Откуда: Новороссийск-Краснодар-Москва

Re: Как поменять местами X и Y в полигональном слое?

Сообщение Saimon » 23 сен 2010, 12:50

для того чтобы повернуть на 90 градусов надо в полях Rotation X и Roatation Y ввести 90, тогда шейп будет повернут на 90 градусов. Для выполнения этой операции должен быть включен режим редактирования.

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Как поменять местами X и Y в полигональном слое?

Сообщение Александр Мурый » 23 сен 2010, 13:03

А это точно афинное преобразование? Я что-то не уверен..

Вернемся к GRASS.
Метод проверен на единичном простом полигоне в произвольных прямоуг. координатах XY. Будет ли он работать (и как?)
в слое с сотнями объектов и, например, в ?? СК и ?? проекции -- отдельный вопрос..
  • Импортируем векторные данные в GRASS
  • Есть вект. слой XY_polygon. Надо получить координаты вершин.
  • Сначала преобразуем границы полигона в линии:

    Код: Выделить всё

    v.type in=XY_polygon out=XY_line type=boundary,line
  • Вытаскиваем в отдел. слой вершины (вертексы):

    Код: Выделить всё

    v.to.points -v in=XY_line out=XY_vertex
    У слоя точек получается 2 таблицы аттрибутов (1 - от производной линии, 2 - собственно точки), нам нужна вторая.
  • Добавляем к 2 таблице два новых поля -- X и Y:

    Код: Выделить всё

    v.db.addcol map=XY_vertex layer=2 columns='x DOUBLE PRECISION,y DOUBLE PRECISION'
  • Заносим в новые поля таблицы координаты наших точек:

    Код: Выделить всё

    v.to.db map=XY_vertex layer=2 option=coor col=x,y
  • Теперь самое интересное: экспорт точек в ASCII-файл и тут же импорт их назад в новый слой, но со сменой
    полей координат

    Код: Выделить всё

    v.out.ascii input=XY_vertex layer=2 format=point | v.in.ascii output=YX_vertex x=2 y=1 cat=3
    Слой XY_vertex при экспорте в текстовый файл выдает
    > v.out.ascii input=XY_vertex layer=2 format=point
    195.02074689|929.46058091|1
    396.26556017|668.04979253|2
    313.2780083|454.35684647|3
    375.5186722|381.74273859|4
    437.7593361|410.78838174|5
    570.53941909|531.12033195|6
    493.77593361|844.39834025|7
    284.23236515|962.65560166|8
    195.02074689|929.46058091|9

    и по "каналу" (|) импортируем назад, но со сменой полей
    ... v.in.ascii output=YX_vertex x=2 y=1 cat=3
    т.о. X и Y меняются местами.
  • Создаем таблицу для нового слоя точек:

    Код: Выделить всё

    v.db.addtable map=YX_vertex columns='cat int, x double precision, y double precision'
  • Заносим в табл. координаты точек:

    Код: Выделить всё

    v.to.db map=YX_vertex option=coor col=x,y
  • Теперь главная проблема -- КАК собрать новый полигон из точек? В данном простом случае я вручную соединил
    вершины линией, но как собрать "на автомате", пока не знаю.
  • Чтобы увидеть новый полигон, задаем перед этим под него текущий регион:

    Код: Выделить всё

    g.region vect=YX_vertex
    , далее d.vect или GUI.
  • Чтобы посмотреть старый полигон, делаем:

    Код: Выделить всё

    g.region vect=XY_vertex
    , далее d.vect или GUI.
Редактор материалов, модератор форума

reasonat
Завсегдатай
Сообщения: 257
Зарегистрирован: 10 июн 2009, 12:21
Репутация: 0
Откуда: Екатеринбург
Контактная информация:

Re: Как поменять местами X и Y в полигональном слое?

Сообщение reasonat » 23 сен 2010, 13:39

Saimon писал(а):повернуть на 90 градусов надо в полях Rotation X и Roatation Y ввести 90, тогда шейп будет повернут на 90 градусов.
и
kryl писал(а):поменять X и Y.
это разные вещи. Надо повернуть оси + отразить относительно одной из них

Saimon
Завсегдатай
Сообщения: 478
Зарегистрирован: 25 фев 2009, 09:00
Репутация: 14
Откуда: Новороссийск-Краснодар-Москва

Re: Как поменять местами X и Y в полигональном слое?

Сообщение Saimon » 23 сен 2010, 14:13

Да что-то я погорячился....
:oops:

kryl
Завсегдатай
Сообщения: 324
Зарегистрирован: 14 фев 2010, 20:42
Репутация: 0

Re: Как поменять местами X и Y в полигональном слое?

Сообщение kryl » 23 сен 2010, 14:29

Отразить то модуль отражает (с параметрами ScaleX: 1, ScaleY: -1), а вот RotationX:90 RotationY:90 дают невообразимо странный результат с коверканьем масштаба

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Как поменять местами X и Y в полигональном слое?

Сообщение Александр Мурый » 23 сен 2010, 14:38

Если доразобраться с созданием "отраженного" полигона из точек и проекциями/СК, то метод вполне рабочий. Можно сделать шелл-скрипт (если в linux) или на питоне, но это надо уметь .. 8)
А так, будут вопросы -- постараюсь ответить.
Редактор материалов, модератор форума

kryl
Завсегдатай
Сообщения: 324
Зарегистрирован: 14 фев 2010, 20:42
Репутация: 0

Re: Как поменять местами X и Y в полигональном слое?

Сообщение kryl » 23 сен 2010, 14:43

А в параметрах v.transform доступных из QGIS вообще нет rotation, это баг или фитча?

kryl
Завсегдатай
Сообщения: 324
Зарегистрирован: 14 фев 2010, 20:42
Репутация: 0

Re: Как поменять местами X и Y в полигональном слое?

Сообщение kryl » 23 сен 2010, 14:49

amuriy писал(а):Если доразобраться с созданием "отраженного" полигона из точек и проекциями/СК, то метод вполне рабочий. Можно сделать шелл-скрипт (если в linux) или на питоне, но это надо уметь .. 8)
А так, будут вопросы -- постараюсь ответить.
Спасибо, но пока наверное попробую через v.transform так как это на первый взгляд проще

kryl
Завсегдатай
Сообщения: 324
Зарегистрирован: 14 фев 2010, 20:42
Репутация: 0

Re: Как поменять местами X и Y в полигональном слое?

Сообщение kryl » 23 сен 2010, 14:52

v.transform input=test@kirov output=test_a3@kirov yscale=-1 zrot=90
Вроде работает

kryl
Завсегдатай
Сообщения: 324
Зарегистрирован: 14 фев 2010, 20:42
Репутация: 0

Re: Как поменять местами X и Y в полигональном слое?

Сообщение kryl » 23 сен 2010, 14:55

Выводы:
и плагин аффинного преобразования в QGIS и QGIS-овский интерфейс к ГАССовскому v.transform работают с ошибками и нуждаются в переработке

Ответить

Вернуться в «Общий - ПО»

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

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