Что не так с этим преобразованием Proj4? - PullRequest
1 голос
/ 23 декабря 2011

Я внедряю поддержку карт WMS в программном обеспечении моей компании.Серверы возвращают список проекций, в которых доступны их карты, но наше программное обеспечение отображает данные только в формате WGS84 (широта / долгота или UTM), и не все серверы возвращают CRS «CRS: 84» или «EPSG: 4326».В результате мне нужно преобразовать / перепроектировать данные.Некоторые серверы возвращают довольно необычные, и у меня возникают проблемы с одним из них: EPSG: 3112 (GDA94 / Geoscience Australia Lambert), используемый WMS-сервером Geoscience Australia .

.чтобы отобразить карту на экране, мне нужно преобразовать координаты широты и долготы WGS84 требуемого экрана или ограничивающего прямоугольника в CRS сервера, запросить изображение карты, а затем нарисовать преобразовать ограничивающий прямоугольник карты (в CRS сервера) обратно вWGS-84 лат / долг.Похоже, что это работает не совсем правильно:

Overlaid maps from two servers

Это изображение является частью австралийского острова Тасмания.Серая береговая линия от Демис , в WGS: 84 проекции.Синий контур и серая сетка взяты из Geoscience Australia , в EPSG: 3112, но (теоретически) перепроектированы через Proj4, чтобы соответствовать серой береговой линии.Как вы можете видеть, это довольно неточно, до 50-100 километров.Если бы на этом экране были нарисованы сетки WGS-84, они были бы идеально вертикальными и горизонтальными.Также обратите внимание, что остров растянут, т.е. это больше, чем вращение.Мне кажется, что перепроецирование вообще не работает.

Две строки инициализации Proj4, которые я использую:

  • WGS-84 (WMS CRS: 84):+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs
  • EPSG: 3112: +proj=lcc +lat_1=-18 +lat_2=-36 +lat_0=0 +lon_0=134 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs

Обращение отдельной точки от WGS-84 до EPSG: 3112 и обратно дает исходную точку:

  • WGS: 84: (145.0, -42.0)
  • до EPSG: 3112: (931684.430679232, -4764432.89032608)
  • и обратно в WGS-84: (145, -41.999999999999999)

Все преобразования выполняются с использованием pj_transform.

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

Вот некоторые идеи, которые у меня были:

  • Голубой остров, похоже, все еще находится в проекции Ламберта.Это вероятно?Это объяснило бы визуальное искажение.
  • Мы используем версию библиотеки Proj4 DLL, которая была построена много лет назад, и, хотя кажется, что вы можете встраивать различные данные о датах и ​​т. Д. В DLL, я не знаю, так ли этобыло сделано.Proj4 не отмечает ошибку при выполнении преобразования координат, поэтому в настоящий момент я работаю с предположением, что если библиотека довольна, это внешняя ошибка (то есть с моей стороны). Я также не знаю причиныза то, что у нас есть собственная, многолетняя сборка DLL, вместо использования готового двоичного файла с сайта Proj4.Тем не менее, даже двоичные файлы Proj4 имеют одну версию и, похоже, не созданы для включения всего в виде двоичных данных.
  • Некоторые версии Proj4, похоже, загружают данные и другую информацию извне .Я попытался заменить нашу DLL и настроить ее для использования некоторых из этих файлов с помощью переменной среды PROJ_LIB, но без видимых изменений.
  • Часть +towgs84=0,0,0,0,0,0,0 строки EPSG: 3112 кажется странной.Это из файла 'epsg' в последней загрузке Proj4, но может ли это быть неправильно?

Возможно, лучшая формулировка этого вопроса:

  • Что мне делать?Нужно иметь или сделать преобразование между этими двумя CRS?

Спасибо за любую помощь:)

...