Страница 1 из 1

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

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

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

Добавлено: 19 июн 2013, 18:26
Игорь Белов
Хотите увидеть все шесть знаков после десятичной точки, измените тип колонки на Decimal (xx, 6).

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

Добавлено: 19 июн 2013, 18:47
Slinger
Но для этого мне придётся создать свои колонки типа Decimal. А могу ли я вывести все знаки через запрос. А-ля запрос - sql запрос и т.д. ?

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

Добавлено: 19 июн 2013, 20:03
Boris
функция Format$ выдаст вам все цифры какие там есть:

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

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

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

Добавлено: 19 июн 2013, 20:16
Игорь Белов
Если через SQL-запрос, то укажите в качестве выводимых колонок выражения такого вида:

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

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

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

Добавлено: 19 июн 2013, 21:34
Slinger
Эх, знал же, что надо смотреть в сторону функции format. Спасибо за помощь!

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

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

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

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".

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

Добавлено: 21 июн 2013, 23:13
Slinger
ErnieBoyd

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

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

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

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

Добавлено: 23 июн 2013, 09:53
Slinger
Institor

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

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) + """"""}

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

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

Нам, правда, нолики в минутах/секундах не принципиальны, поэтому я через банальный 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) + """"""}

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

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

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

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