воскресенье, 20 октября 2013 г.

Бабушкин рецепт получения нужной точности координат в Mapinfo.

Когда-то давно, на заре моего освоения Mapinfo, кто-то из коллег обратил внимание на то, что при смене границ (Bounds) у таблицы, происходит изменение значений координат узлов фигур. Как следствие, происходило и изменение площади объекта.
Будучи человеком любопытным, я начал копать интернет на эту тему. Вот тогда я и  нашел чудный сайт  www.paris-pc-gis.com, зеркало которого располагается по новой ссылке. Помимо нужной мне информации, там было еще много чего вкусного и полезного.
Итак, вот что удалось выяснить.
Для внутреннего хранения и обработки координат, MapInfo использует внутреннюю виртуальную сетку, таким образом, как я понимаю, производится переход к целочисленной математике.
Ширина и высота границы таблицы делится на 2000000000 (2 миллиарда) и получается точность по каждому измерению, независимо от принятых единиц измерения длины.
Получаем простые формулы для получения точности по каждой координате:
Точность по X: dX = (MaxX - MinX)/2000000000
Точность по X: dY = (MaxY - MinY)/2000000000

При диапазоне карты 2000000 м по ширине, точность будет 1 мм.
При диапазоне карты 200000 м по ширине, точность будет 0,1 мм.

Рисунок, иллюстрирующий расположение объекта на "сетке" координат
 А вот что происходит с объектом при изменении границы таблицы.
Система координат исходной таблицы:
CoordSys NonEarth Units "m" Bounds (0, 0) (2000000000, 2000000000)
Система координат измененной таблицы:
CoordSys NonEarth Units "m" Bounds (0, 0) (2500000000, 2500000000).

Для просмотра информации об СК очень удобно использовать штатный инструмент из комплекта утилит Mapinfo "Coordsys Bound Manager" (в русской версии она называется "Границы рамки карты")
 А вот его интерфейс


Теперь координаты объектов всегда будут у вас под контролем.
Ссылка на файлы примеров

вторник, 15 октября 2013 г.

Индексы. А оно надо?

Продолжая тему индексов, я провел показательное тестирование влияния индексов на выполнение запросов к таблицам.
Тестовая таблица имеет порядка 400000 записей. По условию поиска выбиралась последняя запись в таблице.
Текст тестовой программы:
 Суть программы в следующем: делается циклический (1000 раз) выбор последней записи из большой таблицы. Для пущей нагрузки, перед выборкой записи производится переход на первую запись исходной таблицы. В первом проходе делалась обработка без индекса по поисковому полю SHAPE_GID, во втором - с построенным индексом.
Машинка, на которой делался тест достаточно шустрая, но это не очень важно, т.к. важны относительные показатели, а не абсолютные.
А вот и результаты...
Без индекса программа выполнялась примерно 16 минут (что составляет 960с).
С индексом все произошло за 2с.
Разница в скорости 960/2 = 480 раз.
Вот как-то так...

воскресенье, 13 октября 2013 г.

Индексы и как их готовить...

Активные пользователи Mapinfo могли сталкиваться с сообщениями
Файл индексов XXX создан для другого языка.


Такое сообщение появляется в том случае, если открываемая таблица проиндексирована в Mapinfo, языковая локализация которой, отличается от вашей. Т.е. если вы используете русифицированную Mapinfo и пытаетесь открыть какую-то таблицу, которая была проиндексирована в англоязычной версии Mapinfo, то вы получите подобное сообщение об ошибке. После пропуска сообщения, таблица остается открытой, но индексы деактивируются.
Языковой "проблеме" подвержены только индексы, построенные по символьным полям.

Проблема, вроде, не большая: как и сказано в сообщении Mapinfo, заходим в управление структурой таблицы и перестраиваем индекс. НО, у в управлении таблицей нас ждет сюрприз: информации о полях с индексами нет!!! (в общем, понятно, файл индексов отключен)

Чтобы перестроить индекс надо как-то узнать(вспомнить сообщения об индексах) имя необходимого поля и установить отметку индекса. Только после этого индекс перестроится. Кажется что не большая проблема. А если в таблице несколько индексов? А если таблиц много? Вот тут я вижу проблему.
Вторая проблема - невозможность программно отловить сообщение о несоответствии языка индекса.
Если мы напишем примерно такой код на MapBasic:
...
onerror goto err_trap
  open table rrr
  goto well_done
err_trap:
  resume well_done
well_done:
  ....
то мы не минуем появление сообщения о "языке" индекса.
Почему? Не знаю, но, вероятно, у разработчиков были веские причины для такой реализации, а может - "так получилось".
Теперь давайте посмотрим как организовано хранение информации об индексах для каждой таблицы Mapinfo. Напомню, что таблица Mapinfo хранит свои данные в разных таблицах:

  • <имя файла>.TAB. Этот файл содержит описание структуры данных таблицы. Он представляет из себя небольшой текстовый файл, описывающий формат того файла,который содержит данные.
  • <имя файла>.DAT или <имя файла>.WKS, .DBF, .XLS. Эти файл содержат табличные данные.
  • <имя файла>.MAP. Этот файл описывает графические объекты.
  • <имя файла>.IND содержит индексы полей таблицы.
Для примера создадим простую таблицу с индексами.

В файловой системе образуются следующие файлы:
Tab файл выглядит следующим образом:

Так что же делать пользователям, которые стали обладателями таблиц с индексами, построенными для других языков?
Выход 1: открывать таблицы и вручную перестраивать индексы.
Выход 2: любыми средствами массово удалить файлы *.ind в папках с обрабатываемыми таблицами и "исправить" описание структуры каждой таблицы в файлах *.tab.
Выход 3: обратится к автору и получить готовое лекарство, которое позволит произвести массовую обработку папок с таблицами и перестроить или удалить имеющиеся индексы.

воскресенье, 6 октября 2013 г.

Невероятно, но факт....

Однажды задумался о скорости файловых операций в Mapinfo.
Провел небольшой тест...
Текст программы и результаты на картинке. Время в секундах, потраченное на вывод в файл одинакового количества записей.
Вывод: открыть файл и много в него писать гораздо выгоднее, чем каждый раз открывать и закрывать файл. Но, если файл открывать/закрывать, то файл не блокируется средствами OS и можно просматривать его содержимое во время работы программы Mapbasic, которая делает вывод данных в файл.
В общем-то, Mapinfo тут не самый важный фактор, а основное время затрачивается на файловые операции средствами ОС.