Поменять местами X и Y у векторных данных

Вопросы общего характера по ГИС и дистанционному зондированию, не связанные с конкретным ПО.
Ответить
Константин Силкин
Завсегдатай
Сообщения: 420
Зарегистрирован: 21 мар 2012, 07:37
Репутация: 67
Откуда: Воронеж

Поменять местами X и Y у векторных данных

Сообщение Константин Силкин » 14 июн 2017, 19:28

Добрый день!
Поступил большой набор данных в MapInfo, содержащий много слоёв, в каждом из которых создатели умудрились перепутать координаты X и Y. Объекты в слоях разного типа (точки, полилинии, полигоны), часто смешаны в одном слое. Система координат условная — план-схема (метры). И всё бы ничего, да изображение получается повёрнуто-зеркальное.
Прошу помочь в поиске решения как вернуть координаты на место. Конечно неплохо бы сохранить оформление карты, но на худой конец как-нибудь уж. И ГИС не обязательно MapInfo, если есть относительно удобный способ, то можно в любой программе

Аватара пользователя
nadiopt
Гуру
Сообщения: 4744
Зарегистрирован: 29 янв 2009, 13:27
Репутация: 495
Ваше звание: хрюкало
Откуда: Санкт-Петербург
Контактная информация:

Re: Поменять местами X и Y у векторных данных

Сообщение nadiopt » 14 июн 2017, 20:11

ну я бы вытащила все в таблицы, например путем пакетной конвертации в шейп, потом в опен офис кальк поменяла в дбф колонки местами и подхватила таблицы с координатами в кугисе или аркгисе
ин гроссен фамилен нихт клювен клац клац

Аватара пользователя
Игорь Лебедь
Завсегдатай
Сообщения: 452
Зарегистрирован: 24 апр 2010, 19:47
Репутация: 101
Откуда: Город в клёнах и акациях
Контактная информация:

Re: Поменять местами X и Y у векторных данных

Сообщение Игорь Лебедь » 14 июн 2017, 20:15


Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2229
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1501
Откуда: Казань

Re: Поменять местами X и Y у векторных данных

Сообщение Игорь Белов » 14 июн 2017, 21:35

Очень просто делается средствами MapInfo.

На карте посмотрите крайние координаты. Предположим, объекты всех слоёв помещаются внутри такого прямоугольника:

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

   ┌─── 7510000 ───┐
6100000         6120000
   └─── 7490000 ───┘
Добавьте новую систему координат, т. е. впишите в файл MAPINFOW.PRJ строку:

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

"Non-Earth YX swapped", 3000, 7, 7, 0, 1, 0, 1, 0, 0, 7490000, 6100000, 7510000, 6120000
Открыв рабочий набор, измените в свойствах карты проекцию на новую. Бинго!

Если же нужно изменить порядок координат в самих слоях, воспользуйтесь BatchTools: утилитой BatchProj конвертируйте все слои разом в новую систему координат.
The purpose of computing is insight, not numbers

Константин Силкин
Завсегдатай
Сообщения: 420
Зарегистрирован: 21 мар 2012, 07:37
Репутация: 67
Откуда: Воронеж

Re: Поменять местами X и Y у векторных данных

Сообщение Константин Силкин » 15 июн 2017, 23:25

Надежда, к сожалению, ваш метод не подходит, т.к. в DBF хранятся только семантические атрибуты, геометрическая метрика же — в SHP.
Игорь (Лебедь), спасибо! Занятный модуль. Установил, попробовал на маленьком наборе данных (20 точек) — работает. А на моих больших — не работает. Точки сбивает все в одну кучу, а полилинии и полигоны вообще исчезают. В таблице атрибутов присутствуют, а на карте не наблюдаются. Не помогает даже инструмент увеличения карты до выделенных в таблице объектов — ничего не видно. В чём причины трудно сказать. Может в объёме данных, может в абстрактности проекции. Quantum GIS не хочет понимать такую проекцию, которая есть в MapInfo — план-схема, подставляет автоматом WGS-84
Игорь (Белов), огромное спасибо! Всё сделал по-вашему и получилось. Отличная утилита. А теперь, если я захочу кому-то передать эти данные, то мне придётся также передавать и изменённый файл MAPINFOW.PRJ?

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2229
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1501
Откуда: Казань

Re: Поменять местами X и Y у векторных данных

Сообщение Игорь Белов » 16 июн 2017, 07:44

Константин Силкин писал(а):А теперь, если я захочу кому-то передать эти данные, то мне придётся также передавать и изменённый файл MAPINFOW.PRJ?
Не придётся. Правда, этот кто-то при попытке узнать проекцию слоя через свойства окна карты будет видеть "Широта / Долгота" вместо "План / Схема", но это никому не повредит :)
The purpose of computing is insight, not numbers

gamm
Гуру
Сообщения: 4048
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

Re: Поменять местами X и Y у векторных данных

Сообщение gamm » 16 июн 2017, 07:48

есть два варианта:

План (а), правильный: грузим в R, и тупо идем по файлу, и меняем координаты у всех объектов местами (на всякий случай правим boundbox, но вроде и так сойдет)

План (б), если программировать лень: выгружаем в MIF/MID, и добавляем в каждый файл MIF строку TRANSFORM (она для всех файлов одинаковая), которая меняет координаты местами - смотрим доку, там аффинное преобразование, делаем

X_new = 0*X_old + 1*Y_old + 0
Y_new = 1*X_old + 0*Y_old + 0

импортируем, и сохраняем

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2229
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1501
Откуда: Казань

Re: Поменять местами X и Y у векторных данных

Сообщение Игорь Белов » 16 июн 2017, 08:14

gamm писал(а):План (а), правильный: грузим в R, и тупо идем по файлу, и меняем координаты у всех объектов местами (на всякий случай правим boundbox, но вроде и так сойдет)
Не сойдёт, для MapInfo BBox архиважен.
gamm писал(а):План (б), если программировать лень: выгружаем в MIF/MID, и добавляем в каждый файл MIF строку TRANSFORM (она для всех файлов одинаковая), которая меняет координаты местами - смотрим доку, там аффинное преобразование
TRANSFORM не годится, т. к. осуществляет линейное преобразование:

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

TRANSFORM X_множитель, Y_множитель, X_смещение, Y_смещение
План (в)

Редактировать MAPINFOW.PRJ не придётся.
  1. Утилитой MIFexp экспортируйте слои в MIF/MID.
  2. Запишите в файл swapxy.prj проекцию, которую хотите видеть в выходных MIF. Для примера выше:

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

    CoordSys NonEarth Units "m" Bounds (7490000, 6100000) (7510000, 6120000)
    Файл swapxy.prj должен быть в текущей директории.
  3. Утилитой swapxy.exe конвертируйте MIF'ы:

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

    swapxy.exe "входной файл.MIF" "выходной файл.MIF"
    Лучше написать командный файл, который сконвертирует MIF'ы и скопирует MID'ы из одной папки в другую.
  4. Утилитой BatchMif импортируйте новые MIF'ы.
Вложения
swapxy.zip
Утилита меняет порядок координат в файле MIF
(29.53 КБ) 359 скачиваний
The purpose of computing is insight, not numbers

Константин Силкин
Завсегдатай
Сообщения: 420
Зарегистрирован: 21 мар 2012, 07:37
Репутация: 67
Откуда: Воронеж

Re: Поменять местами X и Y у векторных данных

Сообщение Константин Силкин » 16 июн 2017, 08:51

Спасибо, Игорь! Буду пробовать делать по вашему плану в), если моим контрагентам не понравится иметь дело с нестандартной проекцией

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2229
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1501
Откуда: Казань

Re: Поменять местами X и Y у векторных данных

Сообщение Игорь Белов » 16 июн 2017, 09:16

Константин Силкин писал(а):Буду пробовать делать по вашему плану в), если моим контрагентам не понравится иметь дело с нестандартной проекцией
Существуют способы без явной перестановки координат.

План (г)
На мой вкус самый удобный. Развитие того, что было в моём первом посте.
  1. Добавляем в MAPINFOW.PRJ временную проекцию:

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

    "Non-Earth affine", 3000, 7, 7, 0, 1, 0, 1, 0, 0, 7490000, 6100000, 7510000, 6120000
  2. Утилитой BatchProj конвертируем слои во временную проекцию.
  3. Утилитой MIFexp экспортируем новые слои в MIF/MID.
  4. Во всех MIF'ах из предложения CoordSys удаляем подстроку

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

    Affine Units "m", 0, 1, 0, 1, 0, 0
  5. Утилитой BatchMif импортируем MIF'ы.
План (д)
  1. Добавляем в MAPINFOW.PRJ новую проекцию:

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

    "Non-Earth XY #1", 2000, 7, 7490000, 6100000, 7510000, 6120000
    Она вполне "стандартна".
  2. Утилитой MIFexp экспортируем слои в MIF/MID.
  3. Заменяем предложение CoordSys в каждом MIF'е такой строкой:

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

    CoordSys NonEarth Units "m" Affine Units "m", 0, 1, 0, 1, 0, 0 Bounds (6100000, 7490000) (6120000, 7510000)
    Существует масса способов сделать это быстро.
  4. Утилитой BatchMif импортируем новые MIF'ы.
  5. Утилитой BatchProj конвертируем созданные слои в новую проекцию.
Числовые значения границ даны для примера из моего первого поста. В итоге система координат слоёв - обычная план-схема.
Последний раз редактировалось Игорь Белов 16 июн 2017, 11:26, всего редактировалось 3 раза.
The purpose of computing is insight, not numbers

gamm
Гуру
Сообщения: 4048
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

Re: Поменять местами X и Y у векторных данных

Сообщение gamm » 16 июн 2017, 09:33

Линейное пребразование в написанном мной виде просто меняет координаты местами.

[ Сообщение с мобильного устройства ]

gamm
Гуру
Сообщения: 4048
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

Re: Поменять местами X и Y у векторных данных

Сообщение gamm » 16 июн 2017, 09:41

Мдя, память подвела. Был уверен, что там 6 параметров ...

[ Сообщение с мобильного устройства ]

Ответить

Вернуться в «Общие вопросы»

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

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