Я внедряю поддержку карт WMS в программном обеспечении моей компании.Серверы возвращают список проекций, в которых доступны их карты, но наше программное обеспечение отображает данные только в формате WGS84 (широта / долгота или UTM), и не все серверы возвращают CRS «CRS: 84» или «EPSG: 4326».В результате мне нужно преобразовать / перепроектировать данные.Некоторые серверы возвращают довольно необычные, и у меня возникают проблемы с одним из них: EPSG: 3112 (GDA94 / Geoscience Australia Lambert), используемый WMS-сервером Geoscience Australia .
.чтобы отобразить карту на экране, мне нужно преобразовать координаты широты и долготы WGS84 требуемого экрана или ограничивающего прямоугольника в CRS сервера, запросить изображение карты, а затем нарисовать преобразовать ограничивающий прямоугольник карты (в CRS сервера) обратно вWGS-84 лат / долг.Похоже, что это работает не совсем правильно:
Это изображение является частью австралийского острова Тасмания.Серая береговая линия от Демис , в 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?
Спасибо за любую помощь:)