Затем координаты всех объектов в базе были преобразованы для точного соответствия реальным GPS координатам.
(при этом также карта повернута на 6 градусов)
Если смотреть в QGis, то стало вот так (мапсервером отображается аналогично):
В параметрах каждого слоя в QGis осталось то что было раньше: "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
Подскажите пожалуйста, что нужно сделать чтобы вид был как раньше (прямоугольные дома, улицы)?
(повторюсь, что новые координаты в любой точке соответствуют реальным GPS-координатам, т.е. новые координаты правильные)
В качестве допущения примем трехмерную систему координат WGS84,
основанную на сфероиде, декартовой в районе города. Город имеет не
большие размеры и находится не в близи полюсов, поэтому такое допущение
не должно сильно сказаться на погрешностях при преобразовании координат.
Для вычисления географических координат по координатам на карте
используем выражения :
Xn=Ax∗Xc+Dx
Yn=Ay∗Yc+Dy
где (Xn ,Yn) — новые географические координаты, (Xc , Yc) —
текущие координаты на карте, (Ax ,Ay) — масштабирование по осям,
(Dx ,Dy ) — географические координаты начала отсчета системы координат
карты.
Но при таком варианте возникает погрешность 25-30м в некоторых точках.
Экспериментальным путем выяснено, что для уменьшения погрешности
необходимо предварительно повернуть карту на 6 градусов относительно начала
координат. Новые выражения преобразования координат имеют вид:
Xn=Ax∗Rx ( Xc , Yc ,angle)+Dx
Xn=Ay∗Ry ( Xc , Yyc ,angle)+Dy
Rx( x , y , angle)=x∗cos (angle)−y∗sin(angle)
Ry ( x , y , angle)=y∗cos(angle)+x∗sin(angle)
где Rx( x , y , angle), Ry (x , y , angle) – функции возвращающие координаты
после вращения точки относительно начале координат.
По 4 точкам вычисляем новые коэффициенты, которые дают
погрешность в пределах 5 метров по большей части города.
Вот изменение для одной таблицы:
update
home_territory_polygon
set
the_geom = rotateZ( the_geom, -0.12538043 );
update
home_territory_polygon
set
the_geom = scale( the_geom, 0.000062421, 0.000032628, 1);
update
home_territory_polygon
set
the_geom = translate( the_geom, 38.727393288, 58.09461128, 0 );
ILYA_ писал(а):Подскажите пожалуйста, что нужно сделать чтобы вид был как раньше (прямоугольные дома, улицы)?
Выводить то что получилось после коррекции в спроецированной (прямоугольной) системе координат - удобной для вас, возьмите для начала например соответствующую зону UTM. Это умеет любая ГИС и картографический сервер, в т.ч. и MapServer.
Если город не на экваторе, то изображение в географической "проекции" обязано быть растянутым по горизонтали.
"Мапсервер" (веб-интерфейс?) скорее всего, показывал карту в проекции Меркатора, а QGIS - честно показывает lat/lon, как она есть. Чтобы этого не было, можно выбрать для показа карты любую подходящую проекцию - UTM соответствующей зоны, как уже посоветовали, или еще что-нибудь.
Сделал как Вы посоветовали,
определил по широте-долготе зону. 58° 3' с.ш. 38° 50' в.д. - это зона 37N
Далее двух местах в QGis установил систему координат:
1) при загрузке слоя из PostGIS
2) в настройках проекта
3) в глобальных настройках QGis указано запрашивать систему координат при загрузке слоя.
Также стоит крестик у "Включить преобразование координат на лету"
Выбранная система:
WGS 84/ UTM зона 37N. (ID источника EPSG:32637)
Строка описания следующая: +proj=utm +zone=37 +ellps=WGS84 +datum=WGS84 +units=m +no_defs
Но дома прямым не стали. Может я что-то не так делаю?
Кстати в базе PostGIS у всех данных стоит проекция(с-ма координат) -1 (т.е. "не задано"). Но ведь это не должно влиять на отображение в QGis, в котором задается проекция и система координат.
Если система координат слоя неизвестна (не прописана) или прописана, но неправильно, то перепроецировать нельзя.
Сначала нужно:
а) точно определить в какой СК у вас данные, вы говорите lat/long WGS84, убедитесь в этом однозначным образом, например киньте сверху пару GPS треков или еще какие-нибудь данные в абсолютно точно известной вам СК
б) прописать эту СК вашим данным, будь то слои в файлах или в базе