НА ГЛАВНУЮ СТРАНИЦУ

ПРИВЯЗКА РАСТРОВ В ARCVIEW и ARCMAP

- Об инструментах

- World-файлы

- Простой случай

- Сложный случай

- Cледствия

- Проблемы?

- Все-таки вам хочется проекций

- ArcMap? ArcMap!

- Проблемы и особенности ArcMap

Как извеcтно, ArcView не содержит средств для привязки растровых (сканированных) изображений. Создатели пакета ESRI рассчитывали, что пользователи приобретут у них ImageAnalysis... Однако отечественные пользователи рассчитывают на другое, и справедливо ворчат: в MapInfo, мол, все есть, а тут нифига! Они правы, в MapInfo процедура простой геопривязки встроена, работает удобно и не вызывает нареканий. Как же быть в нашем случае? С одной стороны, средства геопривязки очень удачно реализованы в ArcMap, и если вы еще не "перешли", то, может, как раз пришла пора? С другой стороны, для векторизации очень хвалят программу EasyTrace, там же заодно есть и привязка растров: изображение можно растянуть, повернуть, посадить, пересохранить и глядеть себе в ArcView уже в нужном месте и масштабе.

Об инструментах

Если продолжать упорствовать, оставаясь в рамках ArcView, то и тут есть немало дополнительных средств. Многие из них вы можете найти в библиотеке скриптов ESRI. Наиболее удачными нам кажутся следующие:

- ImageWarp (Kenneth R. McVay) - наиболее мощная программа. Вяжет что угодно и куда угодно. Если вы дока в растрах и гридах, то вас это заинтригует. Однако сила, как известно, опасна. Если вы ничего не понимаете в проекциях и эллипсоидах, то искорежить квадратик своего растра, превратив его в обрывок резинового бинта, у вас не займет и минуты. Сильная вещь, но как-то сомнительно использовать именно ее "силу"... Ведь о проекционных преобразованиях ImageWarp все равно "не знает". Для кручения растра Kenneth использует возможности SpatialAnalyst, и без него программа не будет работать. В обчем мы попробовали разок и бросили - слишком замысловато, задача-то чаще всего простая как пень - наложить кальку на лист.

- Image to Map World file Creator Extension (Register.avx - Kenneth R. McVay). Позволяет создать (восстановить) геопривязку для растра, растр притом не корежит и Spatial не требует. Если вы уверены, что ваш растр уже в нужной проекции, это самое то, что вам надо. Собстно, Register не что иное, как плоская предтеча ImageWarp, и это нам понравилось больше - развлекались, помню, пару недель.

- Программа ImageGeoRef (Imagegeoref.avx - George Raber) - скорее редактор геопривязки, чем программа работы с изображениями. Если вы уверены не только в вашей проекции, но и в размере вашего пикселя, то вам это понравится. Этим инструментом мы пользовались до начала эры Arcmap - и было очень удобно. Скачать его можно здесь.

World-файлы

Однако, наигравшись со всеми этими средствами, мы поняли, что для работы с многочисленными растрами в ArcView ни одно из них не обязательно. Куда важнее представлять себе принципы работы с растрами в ГИС вообще. Зная их, вы сами можете построить достаточно эффективную методику, причем практически не прибегая к программированию: все необходимое уже заложено создателями пакета. Итак, сначала о принципах геопривязки. Не стоит думать, что это важно лишь программистам: чуток терпения, и вы сможете применить знание там, где и не думали. Геопривязка растра, по традиции, фиксируется в так называемом world-файле. Это текстовой файл с именем как у растра, но с другим расширением: *.tfw для *.tif, *.bpw для *.bmp и так далее. Можно и просто добавить букву "w" к расширению, это тоже работает: bmpw, tifw, jpgw, jpegw, tiffw и т.п.) Описание world-файла имеется в Help'е ArcView, по русски оно также хорошо изложено на GIS-Lab, но не лишне повторить это и здесь. В файле всего шесть строк:

1) размер пиксела на местности, по оси X;

2) параметры поворота, для ArcView ноль;

3) параметры поворота, для ArcView ноль;

4) размер пикселя на местности, по оси Y (с минусом!);

5) реальная x - координата верхнего левого угла изображения;

6) реальная y - координата верхнего левого угла изображения;

Набор немного странный, но это не что иное, как шесть параметров так называемого афинного преобразования, словом, числа сразу идут в формулу. ArcView не создает такой файл, но работать с ним умеет. Если ваш растр уже сопровождается таким файлом, то значит, он геопривязан и, возможно, подгрузится "куда надо" сам. Если нет, то придется потрудиться. Начнем с простого случая, когда, кроме растра, у вас других данных нет и не предвидится, ну разве что по этому же растру вы их и нарисуете.

Простой случай

Вам повезло, и не надо ничего знать о ни проекциях, ни даже о системах координат: начинаем привязку сразу. Одну только вещь вам придется определить - это дискретность вашего изображения. На карте должен быть хотя бы масштаб, согласитесь - иначе это будет не карта, а бог знает что! Масштаб для растра это не что иное, как размер пикселя в единицах карты. Допустим, на вашем растре есть сетка. Допустим также, что и размеры сетки вам известны. И пусть вам повезло в третий раз, и ваш растр отсканирован ровно и не требует поворота. Тогда вам несложно узнать этот самый размер. Как правило, размер пикселя составляет несколько метров или десятков метров на местности. Уточнить это поможет любой графический редактор или браузер. Откройте растр, и инструментом типа линейки измерьте квадрат сетки в пикселях. Например, их окажется 500 штук. Зная размер сетки на местности (например, в случае с миллионкой это 20 километров), мы получим размер пикселя - 20000 метров делим на 500 штук = 40 метров. Базовые параметры для геопривязки готовы. Мало того, это ВСЕ, что вам нужно в простом случае, можете начинать работу с картой. Полученные 40 метров мы пишем в первую и четвертую строки wld-файла, причем в четвертую с минусом (пусть этот минус вас не беспокоит, это просто формальность). Ваш world-файл ГОТОВ! Он выглядит вот так:

40
0
0
-40
0
0

И этого достаточно! Правда, растр подгрузится возле нуля координат, но будет иметь верный масштаб. А какая вам разница, где он находится, если вы своих координат сами не знаете? Вот когда будете знать, тогда и вернетесь к этому вопросу. Впрочем, не расстраивайтесь - поменять положение растра в вашем координатном пространстве легко будет и потом, может, вы уже и сами догадались, каким образом. А пока нужно закончить с wld-файлом. Задаем ему верное имя: если растр зовется map.tif, то привязка должна зваться map.tfw и лежать тут же, рядом с tif. Сохраняем map.tfw, проверяем, загружаем растр в ArcView... Готово, проверяйте маштаб линейкой.

Как быть в нашем простом случае, если мы не знаем размера сетки? Пытайтесь угадать, исходя из масштаба и облика карты. Типовые карты имеют сетку размером 2 см, иногда 4 см, планы - вплоть до 10 см. А если сетки вообще нет? Тогда сойдет и масштабная линейка. Если она расположена ровно, то дело в шляпе - повторяем те же операции, лишь вместо сетки берем деления шкалы (в метрах, конечно). Чем больше делений охватить, кстати, тем надежнее будет ваш расчет, не ленитесь замерять пиксели хоть поперек всего листа. А что делать, если известен лишь числовой масштаб или, например, лишь какое-то расстояние на карте? Догадаться несложно, сообразите сами.

Перейдем к системам координат. Допустим, вам известны координаты хотя бы одной точки вашего растра, тогда появляется возможность "посадить" ее куда надо. Но как быть, нам ведь нужно знать координаты не какой попало точки, а верхнего левого угла! Тогда можно было бы заполнить строки 5 и 6. Вы уже сообразили, как это сделать? Рассчитать координаты исходя из количества пикселей между известной точкой и углом, с учетом размера пикселя и т.п..? Не спешите хвататься за калькулятор, есть способ попроще. Для начала укажите в этих строках ПРИМЕРНЫЕ координаты угла, например, хотя бы координаты той самой "известной точки" - вполне сойдет для начала. Более точно мы сможем подогнать прямо в ArcView. Сохраняем world-файл, грузим растр в Arcview. Измеряем координаты известной точки. Она, конешно, попала "не туда". Измеряем линейкой, насколько не туда, но уже не в пикселях, а сразу в единицах карты (метрах в нашем примере). Подправляем world-файл соответственно, снова грузим, проверяем еще раз. Если у вас есть сомнения, проверьте посадку по другим точкам. Геопривязка завершена. Кстати, помочь "двигать" растр и редактировать world-файл синхронно с ArcView вам поможет скрипт ImageGeoRef, там есть "лапа" и кнопка освежения вида.

Сложный случай

Как действовать, если у вас уже есть данные, и вы хотели бы посадить растр непременно "на них"? Точно так же, как и выше, начните с вычисления размера пикселя любыми доступными средствами. Вычисляйте его исходя из размера здания, например, если нет ни сетки, ни линеек. Вычислив его, сажайте растр по одной лишь известной точке. По второй только ПРОВЕРЯЙТЕ посадку, и в случае несовпадения корректируйте в первую очередь опять же размер пикселя, и только потом положение. Собственно, если вам известны координаты двух точек на растре, из этого вычислить размер пикселя не представляет труда, остальные точки нужны лишь для контроля. Просто выбирайте характерные точки с умом, и помните, что двух достаточно - остальные лишние для плоской привязки, чаще всего они лишь портят картину. Яркий пример - резиновые извращения ImageWarp. Точки для привязки, разумеется, должны быть "хорошие", правильные. Лучше всего подходят узлы сетки или углы карты. Точечные объекты на местности тоже годятся, если это важные ориентиры - обычно топографы их наносят аккуратно. Однако от одной версии карты к другой и они могут "сползать". То же можно сказать и о скрещениях дорог. Очень опасно уповать на характерные изгибы рек, берегов - они меняются не только на картах от года к году, но и в природе. Однако на снимках, бывает, только они и видны отчетливо. Совсем не стоит уповать на контуры растительности, они и видны-то нечетко.

Привязав изображение, подумайте, довольны ли вы? Найдите другие критерии проверки, кроме характерных точек. Обычно качество привязки хорошо контролируется визуально - глаз намного быстрее и точнее анализирует всю картину линий и контуров, и видит соответствие или расхождение, доверяйте своему зрению. Бывает, математика по точкам дает небольшую ошибку, а глаз уверен, что растр в целом смазан относительно вектора. Попытайтесь тогда сформулировать для себя, что именно вам не нравится. Если эта смазанность носит регулярный характер, то, скорее всего, можно поправить ситуацию - точки выбраны неверно, растр либо сполз либо растянут, есть небольшой поворот и т.п. - эти проблемы решаются. А вот если растр сидит, например, по краям хорошо, но посредине "не в фокусе" - тут дело хуже: скорее всего, не совпадают проекции вашей карты и изображения.

Cледствия

Вот вы уже и знаете основы работы с world-файлом. Не так уж хитро? Да. Не так уж много? А вот и нет. Дальше ваша соображалка выдаст как из рога изобилия многое в совершенно неожиданных ситуациях. Например, вот только некоторые идеи из нашей копилки: - Если у вас не один растр, а серия, то скорее всего размер пикселя будет одинаков. Поэтому файлы геопривязки можно плодить копированием - подправлять нужно только положение очередного растра, что несложно сделать прямо на карте, лапой, как описано выше. Последовательно увеличивая зум обзора, несложно добиться идеальной - пиксель в пиксель - стыковки черепицы, ведь подгонку нужно вести всего по одной характерной точке, причем для стыковки годится любая яркая пикселина (с краю, конечно).

- Если ваша серия имеет регулярный шаг, то его можно сразу учесть, подправляя строки 5 и 6 прямо при копировании.

- Если вы знаете заранее разрешение растра, заданное при сканировании, то гадать по поводу размеров пикселя не обязательно. Например, триста точек на дюйм карты... Это при масштабе одна миллионая... Множим на 2.545, остальное на ум пошло.

- Если после измерения и расчета пикселя вручную его значение покажется вам подозрительно знакомым, подумайте, на что это похоже. Правильно, на неточность расчета. Поэтому 39.966666 не стесняйтесь округлить до 40. Такие микронеточности часто возникают еще и при "автоматической" посадке изображения по точкам, в ArcMap или EasyTrace. В этом случае также их не грех округлить, восстанавливая картографическую справедливость: обычно это дает хороший результат.

- Если операции по привязке растров стали занудно-типовыми, несложно сочинить програмку обработки world-файлов как текста, или даже создать шаблоны в Excel. Даже если эта программа будет разбрасывать растры по вашей территории "начерно", это будет хорошим подспорьем операторам, в случае если растров у вас десятки и более.

- Mapinfo имеет сходный, текстовый формат описания регистрации изображений. Как туда передать геопривязку из ArcView? Структура прозрачна - в соответствующем файле .tab просто зафиксированы координаты характерных точек на местности и их положение в поле изображения. Если сообразить, что роль характерных точек могут играть и углы растра, то пересчет будет элементарным, а алгоритм всегда одним и тем же - можете зафиксировать его в виде электронной таблицы или простого скрипта на любом языке. Пример такой методики приводится здесь.

- Все вышеописанное реально при отсутствии поворота, но кто сказал, что он должен быть? Сканируйте свои растры ровно... Это трудно? Да нисколько. Нарисуйте линию сетки на обороте листа, на просвет например, и совместите ее с направляющей сканера. Посадки "на глаз" будет вполне достаточно, это обеспечивает точность до полградуса и дает по листу A3 очень небольшую ошибку. Если нужно более точно, можно согнуть или даже обрезать лист по сетке и прикладывать этим краем - качество продукции заметно возрастает.

- В принципе, если каким-либо техническим способом обеспечить "ровное" сканирование листов, то процедура геокоррекции как таковая делается вообще не нужна - поворота нет, размер пикселя известен, остается лишь разбросать листы по территории, причем на каждый достаточно одной лишь точки привязки.

- Несложно теперь и обрезать растр подручными средствами. Если при этом не затрагивается верхний левый "привязочный" угол растра, то файл геопривязки вообще править не нужно. Если угол затрагивается, то рассчитать фактор сдвига исходя из размера пиксела - простая арифметика. Однако и этого делать не нужно - просто подгрузите новый растр на старый, и посадите его при максимальном увеличении - вам легко удастся попасть пиксел в пиксел, ведь нужен будет только сдвиг.

Проблемы?

- Растр упрямо садится в ноль координат, или принципиально не реагирует на ваши попытки подправить world-файл. Проверьте имя файла, расширение, каталог и т.п. Особенно забавные глюки возникают с модными сложными именами, когда, например, они содержат пробелы и замысловатые символы. Если все в порядке, возможно, стоит перезагрузить ArcView, чтобы освежить "образ" растра. В ArcMap удалите "пирамиды".

- Растр исчезает вообще или грузится бог знает как. Проверьте значения в world-файле. Возможно, вы перепутали строки и размер пикселя у вас ноль - представляете, что происходит в душе ГИС-процедуры? :)

- Сетка "не садится" в одном из направлений. Скорее всего, искажены пропорции исходного растра, проверьте линейкой на оригинале. Возможно, бумага была растянута при сканировании. Если неравномерность линейная, попробуйте чуть подправить размер пикселя по этому направлению, по горизонтали, например;

- В исходном растре есть небольшой поворот. ArcView не поворачивает растр и уж тем более не правит, но это несложно сделать в графическом редакторе или даже вьювере - бесплатный IrfanView, например, это умеет. Обычно требуется угадать 1-2 градуса, после этого привязывайте как обычно. Кстати, вы обратили внимание, что в строках 3 и 4 надо ВСЕГДА ставить нули? ArcView не умеет поворачивать растр, в отличие от ArcMap, поэтому НЕ пытайтесь вписать параметры поворота в world-файл. Если же это произойдет, и строки 3-4 будут ненулевыми, (например, вам попадется world-файл от ArcMap, иль рука дрогнет), то случится забавная вещь - растр изменит размер и уедет на небольшую величину. Таким образом ArcView пытается хоть как-то имитировать заданный поворот.

- Есть небольшое искажение, например, складка, остальной растр нормальный. По складке вам придется разрезать растр, и привязывать его как два отдельных файла. Вас это не смутит, так как вы уже знаете, как копируется геопривязка;

- Вам не удается убрать небольшой поворот, или растяжение, или другие искажения - но они невелики. Это, бывает, остается и после геопривязки более мощными средствами. Тогда работайте так, будто перед вами не растровое изображение, а обычная прозрачка - время от времени просто двигайте изображение "лапой", чтобы добиться удачного совмещения для данного участка. Глядеть такую карту целиком неприятно, конечно, но поэтапно векторизовать - почему бы и нет?

- Поворота нет, но сетка не садится в обоих направлениях. Не паникуйте: если это происходит равномерно, то, возможно, просто сбит масштаб. Проверьте размеры пикселя еще раз, стараясь добиться большей точности. Если есть неравномерность искажений хотя бы в одном из направлений, то привязать растр качественно вряд ли удастся - она скорее всего, искажена проекционным преобразованием или вообще имеет плохое качество - замины, растяжения бумаги и т.п.

- Растр игриво "прыгает" при панорамировании на несколько пиксел туда-сюда. Смените формат растра - глюки отмечены лишь для BMP. Кстати, для работы в ArcView пригодно не так уж много форматов. BMP отпадает, JPG годится только для снимков, наиболее удобный GIF грузится только в ArcMap, остается лишь TIF, причем без LZW.

Все-таки вам хочется проекций

Оно и понятно - ведь приятно знать, что ваши данные "сидят" в мировой системе координат. Однако в этом случае вам придется разобраться с проекциями как следует... Но это же нужно и в EasyTrace, и для ArcMap актуально... Апологеты ImageWarp станут бить себя в грудь, мол Warp лечит все. Однако, глядя на результаты проецирования "резиновыми" средствами вспоминается анекдот:

- Доктор, вы меня вылечите и я буду жить? - Будете, но какой смысл?

Иными словами, точность резиновой посадки для мелко- и средне масштабных карт обычно ниже всяких разумных пределов. Лучше уж разобраться с проекциями заранее, профилактически, чем доводить до неоперабельного случая. Если сведения о проекциях не утеряны, то это не так уж сложно: например, вы знаете, что ваш растр представляет собой кусок отсканированной карты миллионного масштаба N-37. Тогда проекция, в которой ее нужно привязывать, будет Пулково-42 зона 7. Координаты в этой системе имеют вид 7456978, 654789. Примерно такие же числа должны быть где-то на вашем растре, поглядите внимательно. Они могут выглядеть как последние несколько цифр от вышеуказанных, стоять возле рисок по краю карты, иметь вид ритмичных крестиков и т.п. Найдите такие отметки, уясните их координаты. Далее постройте точки с этими координатами - лучше всего углы сетки - в вашем виде ArcView, и начинайте привязку, как описано выше. Проекцию в виде устанавливать НЕ НУЖНО!!! Мало того, в проецированный вид изображение привязывается плохо, глючит и тормозит. Привязывайте его в "плоский" вид с проекцией "none", что для ArcView синонимично X-Y плану. Не забудьте, однако, правильно выставить единицы вида - как правило, метры. Это важно для масштаба и для последующих проекционных преобразований.

Если у вас есть векторные данные в этой же проекции, то это облегчит задачу посадки. Привязав растр предварительно, загрузите векторные слои и убедитесь, что растр "сел куда надо". Если же данные в другой проекции, вам придется их перепроецировать оттуда сюда, т.е. К РАСТРУ. Это золотое правило - "всегда к растру" - сохранило актуальность даже в ArcMap. Перебросить потом ваши данные, отрисованные по растру, в другую проекцию можно средствами перепроецирования (в ArcView это Project Utility). Другие варианты начинающим мы не порекомендуем.

Arcmap? Arcmap!

В ArcMap, как известно, есть встроенные средства геопривязки: чтобы ими воспользоваться, включите панель Georeferencing. Может быть, они покажутся непривычными, но инструменты удобные и, главное, работают в целом устойчиво. Общую канву для файлов БЕЗ геопривязки можно порекомендовать такую: подгружаете растр как обычно, потом командой "Fit to Display" сажаете его примерно куда вам нужно. Далее можно уже привязывать по точкам, но... с учетом вышеизложенного мы бы порекомендовали все-таки попробовать угадать размер пиксела. Знаете? Тогда можно создать примерный world-файл командой "Update Georeferencing", зайти в него и вписать "тот самый размер". Если удалось, то остается подвинуть растр на место "лапой" - она есть на этой же панели. Если нет, вам останется долго и нудно сажать растр на место по точкам, подбирая наиболее характерные, отбрасывая выдающие заметную ошибку и так далее, наверно с этим процессом многие знакомы. Сводная табличка точек с расчетом среднеквадратичной ошибки этому способствует. Однако пoсле окончания привязки мы рекомендуем все-таки вернуться в world-файл и подумать над ним немного, нельзя ли его упростить, точнее сказать, облагородить. Если ваш растр ландсат, например, а размер пикселя получился 29.9875456231, то наверно же создатели растра имели в виду ровно 30 метров, остальное - ошибка вашей привязки... Полезно бывает также обнулить факторы поворота, если они микроскопические, ну а положение растра подогнать уже несложно, как вы знаете :) Кстати, вышеописанные для ArcView следствия помогут вам и в ArcMap, если с world-файлами вы будете "на ты": вас навсегда перестанет озадачивать тиражирование геопривязки, вам будет понятна привязка растра без ГИС, только с помощью браузера, не смутит вас и обрезать растр в любом редакторе, сжать, растянуть, ну и тому подобные трюки будут по плечу.

Проблемы и особенности ArcMap

- При смене растра в рамочке выбора геопривязка "слетает", если вы ее не сохранили командой "Update Georeferencing". Вначале это раздражает, а после дает возможность весело играться с растрами, не думая о последствиях;

- Для привязки растра по точкам удобно использовать штатную градусную или километровую сетку. В ArcMap она есть только в макете печати, но и привязывать растр можно там же - макет печати теперь несет всю функциональность вида, только медленнее.

- Кроме сдвига растра, есть еще и поворот растра, но, поскольку он тоже ведется лапой, применять его сложновато.

- ArcMap умеет и читать, и писать поворот растра, но тогда ваши растры делаются несовместимыми с ArcView.

- В отличие от ArcView, доступны почти любые растровые форматы. По скорости работы и качеству для карт оптимальны GIF, TIF, для фотоизображений по-прежнему JPEG. Специализированные форматы типа ECW, SID удобнее для работы, но требуют специальных конверторов и модулей.

- Будьте осторожнее с файлами TIF - никогда заранее не знаешь, как в них хранится геопривязка. Подгружаешь вроде просто с world-файлом, обновляешь привязку, глядь - а она "влезла" уже внутрь самого растра. Встроенный формат в GeoTIFF покруче, он содержит еще и описание проекции со всеми эллипсоидами, оттого в любом виде ложится "куда надо". Но, как известно, мощное оружие обоюдоострое, и испортить растр таким образом тоже легко. Чтобы заблокировать эту функцию для TIF, можно делать файл растра временно read-only.

- Растры в ArcMap, начиная могут быть перепроецированы, не требуя притом Spatial Analyst. Однако редактировать (перепривязывать) их по-прежнему можно только в своей "родной" проекции.

- Перегрузить проект растрами по-прежнему несложно, причем отмечены случаи обвально-разрушительных процессов. Поэтому настоятельно советуем делать резервные копии заранее, сохраняя не только последнюю версию, но и все предыдущие этапы работ.

- Полноценная привязка, включая описание "родной" для растра проекции, хранится в файле .AUX. Поэтому, если вы задумали редактировать напрямую world-файл, то не забудьте AUX своевременно удалить.

- Как самому сделать GeoTIFF? Начиная с девятой версии, ArcMap это умеет. Нужно запустить команду "Экспорт" для растрового слоя, и на закладке указать "GeoTIFF".

Geologic

Эта статья самая старая, и тем не менее остается самой популярной на нашем сайте. Обсудить ее можно здесь. Логическое продолжение за нею следует: читайте "как казаки Гугл привязывали" :)