Работа в проекциях СК-42, СК-63 с точностью до 0.001м

MapInfo, MapBasic
ck63
Новоприбывший
Сообщения: 11
Зарегистрирован: 24 янв 2010, 21:23
Репутация: 0

Работа в проекциях СК-42, СК-63 с точностью до 0.001м

Сообщение ck63 » 26 янв 2010, 18:55

В существущих таблицах имеющих проекцию СК-42 зоны с 1 по 32, отображение координат, создание объектов и т.д, т.п. производится с точность до 1см.
Как не переходя на план-схему работать в проекциях СК-42 с точностью до 1мм?
Например при создании объекта типа в СК-42 зона8 "точка" с координатами X-3200000.777, Y-5050001,116
получается с координатами X-3200000.77, Y-5050001,11
Изображение

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

Re: Работа в проекциях СК-42, СК-63 с точностью до 0.001м

Сообщение Boris » 27 янв 2010, 14:53

Смешно. только вчера хотел написать свои выводы по этому вопросу, для тех кому это интересно, но решил, что люди и сами уже знают. к тому же не очень был уверен в цифрах - решил надо проверить на досуге.
---
вот рецепт:
1. MI хранит координаты в виде целых чисел ограниченной длины (в одном источнике написано 20 байт = что равно приблизительно миллиону дискретных величин). в другом источнике написано что в виде 1/2-х миллионной. переход от этих целочисленных координат к практическим осуществляется с использованием некоторого фиксированного множителя, который ЗАДАЕТСЯ при создании таблицы. И определяется он границами координат таблицы. Увидеть эти границы можно в двух приложениях (Tools) MapInfo - Table Manager и Coordsys Boundaries Manager. Второе каким-то методом позволяет изменить границы - изменить увеличить.
Т.е. если вам нужны точности мм - максимальный разброс координат должен составлять 0,001*1000000=1000 м или 2000 м. На первый взгляд это очень не похоже на правду - слишком маленький разброс. Но так говорит теория http://www.fmepedia.com/index.php/MapIn ... ion_Issues
Все точные работы требуют, что бы были настроены соответствующие системы координат в файле MAPINFOW.PRJ - заданы не границы по умолчанию - а это долька шириной в 1000 км (минимум), и высотой в весь глобус от -10 000 000 до +10 000 000 метров, а границы работы - максимум 1000 км на 1000 км.
2. может все и не так как вам кажется. при выводе на экран или в запрос MI стандартно выводит только 2 символа после запятой. выполните запрос с функцией Format$(координата,"#0.##########") и посмотрите сколько символов она покажет тогда. Правда округление 20 байт - все же не чистый 1000000, а 1024*1024 - может давать бесконечное число символов после запятой. :( Так что именно это и требует проверки. Как именно в вашей СК происходит приращение координат. Более простой способ экспорт в MIF - там будет видно в координатах сколько цифр после запятой.
А так это тема, которая требует действительной проверки. :roll:

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

Re: Работа в проекциях СК-42, СК-63 с точностью до 0.001м

Сообщение reasonat » 27 янв 2010, 15:43

Действительно, не очень правда. Чтобы получить точность координат 0.001 надо сделать пределы карты с разбросом 0.001*2000000000=2000000
Сетка карты MapInfo поделена на 2млрд ячеек по X и по Y. Значит, если нужно получить точность не ниже миллиметра, то пределы карты должны быть с разбросом мин-макс не больше 2 000 000 метров.
Чтобы координаты получались ровно до миллиметра, без хвостов в дальнейших разрядах, то и границы карты должны быть точно с разбросом 2000000м (например, от -500 000 до + 1 500 000 м)

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

Re: Работа в проекциях СК-42, СК-63 с точностью до 0.001м

Сообщение Boris » 27 янв 2010, 17:10

можно ссылку на источник данных? я и сам писал и считал, что размерность в 2 млрд. но источник, который говорит об 20 битах - весьма уважаемый. можно конечно прошерстить библиотеку MITAB там в описании структур данных должно быть точно указано. Но с другой стороны - это сильно трудно в математике делить на 2 млрд, а MapInfo программа старая, тех времен когда длинное целое имело 4 бита - с учетом знака это похоже на два миллиарда, но все же не очень точно = (2*31 - 1) = 2147483647. Скорее всего деление - умножение все же было сделано на двоичной основе, а это значит, что дробные разряды будут всегда. К тому же все координаты MapInfo, равно как длины и площади, возвращает в виде одинарного плавающего числа - в силу особенностей такого представления и хранения числа числа без разрядов будут очень редки.
---
Но, что точно, и это я только вчера проверял - это то, что все функции возвращают округленные обрезанные числа, при том, что если возвращать их через функцию Format$(), которая сама преобразует плавающее в символьную строку, или использовать плавающие переменные в программах на MapBasic'е, то будут все разряды. Я видел до 12-го, хотя по идее и там столько просто нет :)
---
Но в любом случае, это означает, что хочешь точности - урежь себя в границах. И результаты выводимые в окне не дают точного значения координат.

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

Re: Работа в проекциях СК-42, СК-63 с точностью до 0.001м

Сообщение reasonat » 27 янв 2010, 17:38

вот тоже уважаемый источник
или вот еще.
Boris писал(а):MapInfo программа старая, тех времен когда длинное целое имело 4 бита
да, не вы первый считаете, что так проще технически. Но в MapInfo Corp. видимо решили подумать об удобстве пользователя.. Ну хочется так думать )
Не находила еще, где объясняется, на каком основании сетка MI поделена на 2млрд. Видимо, как ближайшее круглое десятичное целое от 4бит.

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

Re: Работа в проекциях СК-42, СК-63 с точностью до 0.001м

Сообщение Boris » 27 янв 2010, 23:20

2 reasonat
Спасибо за ссылки. Для чистоты знания пришлось все таки провести эксперимент. Вот его суть:
1. с помощью простейшего кода создаем набор координат точек

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

dim i
	for i=0 to 100 step 1/300
			WScript.echo(cstr(i) & ";" & cstr(i+0.0005))
	next
2. загружаем это в MI как текстовый файл
3. создаем две таблицы test1000.tab и test1001.tab со следующим набором полей:

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

  Fields 7
    ID1 Integer ;
    X Float ;
    Y Float ;
    cX1 Char (32) ;
    cY1 Char (32) ;
    cX2 Char (32) ;
    cY2 Char (32) ;
4. загружаем в таблицы текстовые данные в поля cX1,cY1 - соответственно. Это будет эталон для сравнения.
В поля X,Y загружаем те же данные с использование стандартной конвертации CHAR -> Float
5. В двух таблиц создаем две практически одинаковые системы координат:
test1000:: CoordSys NonEarth Units "m" Bounds (-1000000, -1000000) (1000000, 1000000)
test1000:: CoordSys NonEarth Units "m" Bounds (-1000500, -1000500) (1000500, 1000500)
- существенно, границы обеих что обе меньше, чем (2**31-1) метров
- предполагаемая точность 1-ой = 1 мм, 2-ой = 1,005 мм
6. кодируем координаты в точки с использованием их системы координат
7. вычисляем координаты полученных точек командой

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

set coordsys table test1000
Update test1000 Set cX2 = Format$(CentroidX(obj),"#0.##########"),cY2 = Format$(CentroidY(obj),"#0.##########")

8. сравниваем результаты в двух таблицах - атрибутивные данные и размещение точек визуально
Clipboard01.jpg
Clipboard01.jpg (3.47 КБ) 22406 просмотров
test_tabs.rar
(1.3 МБ) 641 скачивание
9. проверяем точность данных хранимых в поле с типом float через запрос

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

select x,Format$(x,"#0.##########") from test1000 into q1000
browse * from q1000
---
выводы:
1. на примере 9. видно, что число выводимое по умолчанию содержит меньше разрядов, чем то же самое число принудительно развернутое до максимального числа знаков. особенно хорошо это видно ближе к 100
2. ДА, размерность сетки внутренних координат MAPINFO составляет 2 миллиарда, а не (2**31-1).
3. на системе координат с границами в 1000 км - получается точность ровно в 1 мм, со стандартным округлением.
4. если увеличить границы на 0,5% - видимая размерность чисел - увеличится, но это увеличение за счет остатков от деления.
5. :shock: в таблице test1001 - Самая первая точка с координатами (0;0) - НЕ будет учтена приложением Coordsys Boundaries Manager и НЕ будет выделяться на экране.

ck63
Новоприбывший
Сообщения: 11
Зарегистрирован: 24 янв 2010, 21:23
Репутация: 0

Re: Работа в проекциях СК-42, СК-63 с точностью до 0.001м

Сообщение ck63 » 28 янв 2010, 07:13

Спасибо большое за ответы. Но всё выше описанное применимо для проекции: план-схема!
Проблема же с точностью до 1мм возникает на проекциях созданных Mapinfo : Каусса-Крюгера, созданных на эллипосоиде Красовского (типа СК63, СК42), и уменьшение размеров карты на точность вводимых координат в этих проекциях никак не влияет!

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

Re: Работа в проекциях СК-42, СК-63 с точностью до 0.001м

Сообщение reasonat » 28 янв 2010, 10:22

Ну да :) От сути вопроса ушли. А на эллипсоиде, я так понимаю, на 2 млрд делится 6градусный сектор. По широте получается размер большой, точность меньше, по долготе точность больше. Что делать, надо еще подумать.. А можно поинтересоваться, почему не хочется переходить на план-схему и обратно? Мы то как раз только в план-схеме и работаем.

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

Re: Работа в проекциях СК-42, СК-63 с точностью до 0.001м

Сообщение Boris » 28 янв 2010, 11:05

те не менее, если речь идет именно об СК-42, т.е. о плоской системе координат, у меня все получилось. Причем даже в экранных координатах. В примере - СК-42, зона 7, центр установленной СК (7 500 000, 6 000 000)
test1000a.png
test1000a.png (7.18 КБ) 22390 просмотров
test1000a-2.png
test1000a-2.png (8.91 КБ) 22390 просмотров
подробные команды - чуть позже.

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

Re: Работа в проекциях СК-42, СК-63 с точностью до 0.001м

Сообщение Boris » 28 янв 2010, 11:23

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

Register Table "Z:\87\1.TXT"  TYPE ASCII Delimiter 59 Charset "WindowsCyrillic" into  "Z:\87\1.TAB" 
open Table "Z:\87\1.TAB" as _1
Browse * From _1
Create Table "test1000a" (ID1 Integer,X Float,Y Float,cX1 Char(32),cY1 Char(32),cX2 Char(32),cY2 Char(32)) file "Z:\87\test1000a.TAB" TYPE NATIVE Charset "WindowsCyrillic"
Create Map For test1000a CoordSys Earth Projection 8, 1001, "m", 39, 0, 1, 7500000, 0 Bounds (6500000.0, 5000000.0) (8500000.0, 7000000.0)
set coordsys table test1000a
Insert Into test1000a ( COL1, COL2,col3,col4,col5) Select rowId, COL1, COL2, Format$(COL1,"#0.##########"), Format$(COL2,"#0.##########") From _1
Map From test1000a
browse * From test1000a
set coordsys table test1000a 
Update test1000a Set obj =createPoint(X,Y)
Update test1000a Set cX2 = Format$(CentroidX(obj),"#0.##########"),cY2 = Format$(CentroidY(obj),"#0.##########")
test1000a.rar
(60.96 КБ) 655 скачиваний
и экранный выбор и колонки cX2, cY2 говорят, что на границах 2000 км на 2000 км - точность именно миллиметровая.

ck63
Новоприбывший
Сообщения: 11
Зарегистрирован: 24 янв 2010, 21:23
Репутация: 0

Re: Работа в проекциях СК-42, СК-63 с точностью до 0.001м

Сообщение ck63 » 28 янв 2010, 12:49

Разобрался, проблема оказалось в том что Mapinfo при создании таблицы, поумолчанию создавало СВОИ очень большие "пределы карты".
Create Table "_11" (Поле1 Char(10)) file "C:\Documents and Settings\Admin.MICROSOF-1A4AAF\Рабочий стол\!!!!Новая папка\11.tab" TYPE NATIVE Charset "WindowsCyrillic"
Create Map For _11 CoordSys Earth Projection 8, 1001, "m", 45, 0, 1, 8500000, 0 Bounds (250718.46099, -10002137.4978) (16749281.539, 10002137.4978)

Получается эти "пределы карты" можо менять только при создании карты в окне Mapbasic или в mif файле или спец утилитами?

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

Re: Работа в проекциях СК-42, СК-63 с точностью до 0.001м

Сообщение reasonat » 28 янв 2010, 13:05

ну раз проекция плоская, значит можно настраивать пределы карты, и в mif, и в утилите CoordSys Bounds (из стандартного каталога)

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

Re: Работа в проекциях СК-42, СК-63 с точностью до 0.001м

Сообщение Boris » 28 янв 2010, 14:47

ck63 писал(а):Разобрался, проблема оказалось в том что Mapinfo при создании таблицы, поумолчанию создавало СВОИ очень большие "пределы карты".
Create Table "_11" (Поле1 Char(10)) file "C:\Documents and Settings\Admin.MICROSOF-1A4AAF\Рабочий стол\!!!!Новая папка\11.tab" TYPE NATIVE Charset "WindowsCyrillic"
Create Map For _11 CoordSys Earth Projection 8, 1001, "m", 45, 0, 1, 8500000, 0 Bounds (250718.46099, -10002137.4978) (16749281.539, 10002137.4978)

Получается эти "пределы карты" можо менять только при создании карты в окне Mapbasic или в mif файле или спец утилитами?
и да и нет - самое простое это поправить файл, из которого mapInfo берет эти самые проекции - это MAPINFOW.PRJ он лежит в том же каталоге, куда установлена Mapinfo
Я сразу же после установки мапинфо делаю копию, а из этого файла выкидываю 98% процентов экзотичных для нашей страны систем координат. а свои добавляю. оставшиеся - вроде ГК имеет смысл скопировать в новый раздел и проставить у них границы - тогда и при создании и при сохранении будут создаваться таблицы не с гигантскими границами северный-южный полюс, а со своими местными.
да, забыл добавить, у уже созданной таблицы поменять границы - нельзя. даже утилиты и те сохраняют копию, а потом переименовывают новый файл в старый.

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

Re: Работа в проекциях СК-42, СК-63 с точностью до 0.001м

Сообщение Boris » 28 янв 2010, 14:49

reasonat писал(а):ну раз проекция плоская, значит можно настраивать пределы карты, и в mif, и в утилите CoordSys Bounds (из стандартного каталога)
проверено - то же можно делать и в проекциях долгота-широта. синтаксис это позволяет. а вот проверить повышалась ли точность еще руки не дошли.

ck63
Новоприбывший
Сообщения: 11
Зарегистрирован: 24 янв 2010, 21:23
Репутация: 0

Re: Работа в проекциях СК-42, СК-63 с точностью до 0.001м

Сообщение ck63 » 28 янв 2010, 18:24

проверено - то же можно делать и в проекциях долгота-широта. синтаксис это позволяет
Попробовал, ПОЛУЧИЛОСЬ в долгота-широта задать размеры карты со своими местными параметрами (почемуто думал что Mapinfo не поддерживает bounds для данной проекции :lol: )
самое простое это поправить файл, из которого mapInfo берет эти самые проекции - это MAPINFOW.PRJ,
оставшиеся - вроде ГК имеет смысл скопировать в новый раздел и проставить у них границы - тогда и при создании и при сохранении
будут создаваться таблицы не с гигантскими границами северный-южный полюс, а со своими местными.
А вот с этим проблема: При создании таблицы и задания проекции из mapinfo.prj, заданные мною парметиры Bounds игнорируются!
Попробовал на разных версиях MI ничего не получается, что я делаю не так?

Ответить

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

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

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