Вывести координаты объекта

MapInfo, MapBasic
Ответить
Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Вывести координаты объекта

Сообщение Slinger » 19 июн 2013, 17:30

Возникла нелепая и непонятная задача. Есть некоторый точечный объект в проекции WGS84. Допустим у него есть координаты (при просмотре с карты) 133.782341 48.584622 (долгота, широта). При этом если я хочу банально вывести выборку, содержащие колонки CentroidY(obj), CentroidX(obj), MapInfo выведет мне координаты, ограниченные 4 знаками, то есть 133.782 и 48.5846. То же самое произойдёт, если я создам колонки и обновлю их выражениями центроидов. Чтобы вывести полные координаты объектов, которые MapInfo туда записывает, мы экспортировали выборку в mif или чаще всего в dbf. Но это долго и неудобно. А есть ли возможность всё-таки заставить MapInfo отображать полные координаты, а не сокращённые ?
Последний раз редактировалось Slinger 21 июн 2013, 23:13, всего редактировалось 3 раза.

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

Re: Вывести координаты объекта

Сообщение Игорь Белов » 19 июн 2013, 18:26

Хотите увидеть все шесть знаков после десятичной точки, измените тип колонки на Decimal (xx, 6).
The purpose of computing is insight, not numbers

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Вывести координаты объекта

Сообщение Slinger » 19 июн 2013, 18:47

Но для этого мне придётся создать свои колонки типа Decimal. А могу ли я вывести все знаки через запрос. А-ля запрос - sql запрос и т.д. ?

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

Re: Вывести координаты объекта

Сообщение Boris » 19 июн 2013, 20:03

функция Format$ выдаст вам все цифры какие там есть:

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

print centroidx(selection.obj)
print format$(centroidx(selection.obj),"#0.000#############")
дает результат:
492086.88
492086.87552136887
Но если вам нужно для целей сравнения, то эти десятые доли в формате Float есть и вы можете сравнивать с любым своим числом не опасаясь, что их нет, раз они не видны.

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

Re: Вывести координаты объекта

Сообщение Игорь Белов » 19 июн 2013, 20:16

Если через SQL-запрос, то укажите в качестве выводимых колонок выражения такого вида:

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

CentroidX(obj)*1e6, CentroidY(obj)*1e6
Координаты будут без десятичных точек, но градусы красиво отобьются от дробных частей неразрывными пробелами.
The purpose of computing is insight, not numbers

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Вывести координаты объекта

Сообщение Slinger » 19 июн 2013, 21:34

Эх, знал же, что надо смотреть в сторону функции format. Спасибо за помощь!

Вот если бы ещё удалось так же через запрос, а не через применение сторонних утилит, вывести результаты в формате ГМС (сразу с характерными значками отображения градусов, минут и секунд), то это был бы просто подарок. Может кто сталкивался ?

Sibit
Активный участник
Сообщения: 216
Зарегистрирован: 21 окт 2009, 13:29
Репутация: 28
Откуда: Новосибирск

Re: Вывести координаты объекта

Сообщение Sibit » 20 июн 2013, 04:45

Есть в наборе программ "Пересчет градусов" - позволяет пересчитать градусы минуты секунды в десятичные градусы и обратно. Единственный минус - ставит одинаковый разделитель (т.е. нельзя указать что бы после градусов был знак градуса, а после минут знак минут). Так же есть в стандартном наборе программа "Записать координаты объекта" ( "Извлечь координат" в старых версиях) - позволяет записать координаты объектов в таблицу.
Но я, обычно, отдельно рассчитываю градусы, минуты и секунды, а потом объединяю их в одной колонке с нормальными разделителями.

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

Re: Вывести координаты объекта

Сообщение Игорь Белов » 21 июн 2013, 13:30

Slinger писал(а):Вот если бы ещё удалось так же через запрос, а не через применение сторонних утилит, вывести результаты в формате ГМС (сразу с характерными значками отображения градусов, минут и секунд), то это был бы просто подарок.
Вот Вам подарок:

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

Int(CentroidX(obj)) + "° " + Int((CentroidX(obj) - Int(CentroidX(obj)))* 60) + "' " + (CentroidX(obj) * 60 - Int(CentroidX(obj) * 60)) * 60 + """", Int(CentroidY(obj)) + "° " + Int((CentroidY(obj) - Int(CentroidY(obj)))* 60) + "' " + (CentroidY(obj) * 60 - Int(CentroidY(obj) * 60)) * 60 + """"
Код добавляете в поле с меткой "Select Columns" в диалоге "SQL Select".
The purpose of computing is insight, not numbers

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Вывести координаты объекта

Сообщение Slinger » 21 июн 2013, 23:13

ErnieBoyd

В очередной раз огромное спасибо!

Аватара пользователя
Institor
Активный участник
Сообщения: 243
Зарегистрирован: 22 апр 2011, 08:10
Репутация: 27
Откуда: Хабаровск

Re: Вывести координаты объекта

Сообщение Institor » 23 июн 2013, 03:38

Да, сколько лет уже существует mapinfo, а функции отображения градусов как не было, так и нет...
Кстати, подозреваю, что с кавычками в вышеприведенном запросе будут проблемы (сейчас проверить не могу, к сожалению, все на работе лежит).

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Вывести координаты объекта

Сообщение Slinger » 23 июн 2013, 09:53

Institor

Будут, если их сохранять в .qry. Чтобы не было, нужно подправить .qry и вместо 4-х подряд идущих кавычек поставить 6 штук. Тогда всё будет корректно.

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

Re: Вывести координаты объекта

Сообщение Игорь Белов » 23 июн 2013, 13:09

Отличный ответ, Slinger!
Действительно серьёзный недостаток вышеприведённого кода в том, что он не адаптирован для отрицательных значений. Вот содержимое файла .QRY с кодом, пригодным для положительных и отрицательных значений:

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

Fields {Sgn(CentroidX(obj)) * Int(Abs(CentroidX(obj))) + "° " + Int((Abs(CentroidX(obj)) - Int(Abs(CentroidX(obj))))* 60) + "' " + (Abs(CentroidX(obj)) * 60 - Int(Abs(CentroidX(obj)) * 60)) * 60 + """""", Sgn(CentroidY(obj)) * Int(Abs(CentroidY(obj))) + "° " + Int((Abs(CentroidY(obj)) - Int(Abs(CentroidY(obj))))* 60) + "' " + (Abs(CentroidY(obj)) * 60 - Int(Abs(CentroidY(obj)) * 60)) * 60 + """"""}
Tables {Table1}
Where {}
Group {}
Order {}
Into {Query1}
Browse
Формат вывода совпадает с тем, что MapInfo показывает в окне карты. Очевидно, код можно адаптировать под другие форматы. Вот вариант, выводящий нули в десятках минут и секунд, а также округляющий секунды до 0,1:

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

Fields {Sgn(CentroidX(obj)) * Int(Abs(CentroidX(obj))) + "° " + Right$(Str$(Int((Abs(CentroidX(obj)) - Int(Abs(CentroidX(obj)))) * 60) + 100), 2) + "' " + Mid$(Str$(Round((Abs(CentroidX(obj)) * 60 - Int(Abs(CentroidX(obj)) * 60)) * 60, 0.1) + 100), 2, 4) + """""", Sgn(CentroidY(obj)) * Int(Abs(CentroidY(obj))) + "° " + Right$(Str$(Int((Abs(CentroidY(obj)) - Int(Abs(CentroidY(obj)))) * 60) + 100), 2) + "' " + Mid$(Str$(Round((Abs(CentroidY(obj)) * 60 - Int(Abs(CentroidY(obj)) * 60)) * 60, 0.1) + 100), 2, 4) + """"""}
The purpose of computing is insight, not numbers

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Вывести координаты объекта

Сообщение Slinger » 25 июн 2013, 10:07

Интересный код, спасибо, ушло в коллекцию :)

Нам, правда, нолики в минутах/секундах не принципиальны, поэтому я через банальный Round округляю доли секунд.

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

Fields {Int(CentroidY(obj)) + "° " + Int((CentroidY(obj) - Int(CentroidY(obj)))* 60) + "' " + Round((CentroidY(obj) * 60 - Int(CentroidY(obj) * 60)) * 60, 0.01) + """""", Int(CentroidX(obj)) + "° " + Int((CentroidX(obj) - Int(CentroidX(obj)))* 60) + "' " + Round((CentroidX(obj) * 60 - Int(CentroidX(obj) * 60)) * 60, 0.01) + """"""}

Аватара пользователя
agrozema
Активный участник
Сообщения: 152
Зарегистрирован: 05 мар 2013, 15:36
Репутация: 85

Re: Вывести координаты объекта

Сообщение agrozema » 22 ноя 2013, 07:45

Доброе утро! Ситуация такая. С помощью (подсказок и советов Daba - спасибо ему большое) я конвертнул точки (штук 180) из WGS в МСК, и возникла проблема, Либо необходимо по этим точкам построить полигон, либо как-то выдернуть координаты каждой точки.

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

Re: Вывести координаты объекта

Сообщение ginpetr » 22 ноя 2013, 09:40

Вывести список координат точек в нужной системе координат можно так (в окне Mapbasic):
set coordsys ... (параметры координатной системы начиная с "Eart Projection..." из файла Mapinfow.prj)
Browse
RowID "Номер",
CentroidX(Object) "X",
CentroidY(Object) "Y"
From Таблица_с_точками

Ответить

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

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

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