Почему слой уезжает на сто метров, хотя система координат в файле записана
Это одна из тех историй, где всё «по документам» правильно, а на экране — неправильно. Вы получаете набор данных, кладёте его в свой проект, и он встаёт рядом с тем местом, где должен быть: дома аккуратно повторяют форму квартала, но весь квартал сдвинут на сотню-полторы метров. Геометрия при этом целая, масштаб верный, ничего не искажено — просто всё вместе поехало.
Ниже — что происходит на самом деле, как проверить это у себя за минуту и что я поменял у себя, когда разобрался.
1. Сдвиг берётся из описания системы, а не из самих координат
Координаты в файле почти всегда в порядке. Уезжает не файл, а его прочтение.
Если данные лежат в местной системе на эллипсоиде Красовского (а это почти вся Россия — Пулково-1942, МСК регионов, городские системы), то, чтобы показать их вместе с любыми данными на WGS 84, программе нужен переход между двумя датумами: семь чисел — три сдвига, три разворота, масштаб. Для наших мест это примерно 23, −140, −80 метров по осям. Пока эти числа известны, всё совпадает. Как только они потерялись — данные встают со сдвигом того же порядка: сотня с лишним метров.
Теряются они удивительно легко. Описание системы, которое лежит рядом с
шейп-файлом в файле .prj, существует в двух диалектах. В одном из них узла с
параметрами перехода нет вовсе — есть только имя датума. Современные программы
иногда угадывают систему по остальным параметрам и подставляют переход сами, а
вот приёмник постарше или тот, что не занимается угадыванием, честно берёт датум
без перехода. Получается ровно то, что вы видите на картинке: те же самые дома,
тот же самый файл, два разных прочтения.
2. Как проверить свой файл за минуту
Не нужно ничего запускать — достаточно открыть .prj рядом с .shp любым
текстовым редактором и посмотреть на две вещи:
- есть ли в тексте
TOWGS84[— это и есть те самые семь чисел перехода; - есть ли
AUTHORITY[...]внутри описания датума и в самом конце — это код, по которому систему можно опознать однозначно, даже когда параметры записаны не полностью.
Если нет ни того, ни другого — файл будет читаться по-разному в разных
программах, и однажды вы получите свой сдвиг. Лечится это без перевыгрузки:
можно дописать узел перехода в .prj руками (это обычный текст), а можно задать
систему в приёмнике явно, не полагаясь на то, что он её угадает.
Проверка «уехало или нет» тоже делается на одной точке: возьмите узнаваемый угол здания, посмотрите его координаты в вашем файле и сравните с тем, что показывает любой источник на WGS 84. Расхождение в сотню метров с постоянным направлением — это датум, а не ошибка съёмки.
3. Растр: привязка живёт не внутри картинки
Вторая половина той же истории — подложки. Растр в чертёж вставляют почти всегда, и почти всегда с ним же приходит вопрос «почему картинка легла в нулевую точку».
У картинки координаты хранятся либо внутри файла (так умеет GeoTIFF), либо рядом
— в маленьком текстовом файле-компаньоне: .pgw для PNG, .tfw для TIFF. Шесть
чисел: размер пикселя в метрах, поворот и координаты центра левого верхнего
пикселя. Часть программ читает привязку внутри файла, часть — только компаньон,
и когда компаньона нет, картинка встаёт в начало координат.
Отсюда простое правило: растр всегда должен уезжать вместе со своим
компаньоном и описанием системы, а не одним файлом. Проверить легко —
компаньон это текст, откройте и посмотрите: если размер пикселя выражен долями
градуса (что-то вроде 0,000004), а система в .prj — метровая, то файл
противоречит сам себе, и в чертеже он не встанет.
4. Если координаты есть, а системы нет
Третий случай — самый неприятный: файл открывается, координаты в нём похожи на метры (шести-семизначные числа), а чем они являются — не написано нигде.
Первое, что стоит сделать, — убедиться, что это действительно не градусы: широта и долгота по определению лежат в пределах ±90 и ±180. Всё, что больше, — это метры какой-то плоской системы, и дальше вопрос только в том, какой. Помогает следующее:
- порядок чисел. Шестизначное число около 500 000 — почти наверняка «восток» зоны Гаусса-Крюгера или UTM, а вот семизначное с ведущей цифрой номера зоны — это уже привычный вид местных систем;
- разность с известной точкой. Если на объекте есть хоть один пункт с известными координатами в WGS 84, разность даст и зону, и сдвиг начала;
- сопроводительные документы. В российских проектах система обычно названа в штампе или в пояснительной записке — «МСК-XX, зона N».
Автоматически «определить систему по файлу» нельзя: одни и те же числа могут принадлежать разным системам. Поэтому если файл пришёл без описания — быстрее всего запросить его у того, кто файл отдал, чем перебирать варианты.
5. Что я поправил у себя
Я держу сервис, который отдаёт карты в форматах для чертёжных и ГИС-программ, и все три вещи выше были у меня же не в порядке. Разобравшись, я:
- стал писать в
.prjполное описание с параметрами перехода и кодами — то же самое, что и раньше уходило с чертежами, теперь уходит со всеми векторными выгрузками. Тот же замер, что дал 136 метров сдвига, теперь даёт ноль; - стал отдавать растр архивом вместе с компаньоном и описанием системы, а не одним файлом, — когда система координат для выгрузки выбрана явно;
- переписал сообщение об ошибке для случая, когда загруженный файл не несёт системы, а координаты не похожи на градусы: раньше человек читал «в выбранной области нет данных» и шёл искать другой город, хотя дело было в метрах, принятых за градусы.
Если проверите свои файлы по пунктам 2 и 3 — большая часть «загадочных» сдвигов объяснится за несколько минут.