В нашем приложении у нас есть серверная часть, которая выполняет некоторую растровую обработку в области карты и отправляет изображение обратно во внешний интерфейс на основе OL, который вставляет изображение в указанном экстенте.
Полигон для обработки отправляется в виде координат GeoJSON (EPSG: 4326) на бэкэнд, который затем преобразует многоугольник в прямоугольную проекцию (EPSG: 3035 в данном случае), выполняет обработку и отправляет результаты тепловой карты обратно во внешний интерфейс в виде Изображение в кодировке PNG, перепроецированное на стороне сервера в формат EPSG: 3857 (для соответствия проекции нашей фоновой карты на основе OSM). Затем изображение вставляется в ImageLayer с помощью объекта ImageStatic, экстент которого вычисляется серверной частью (ограничивающая рамка изображения, преобразованная в EPSG: 3035, преобразованная в EPSG: 3857).
Это нормально работает, за исключением полигонов на крайнем севере Скандинавии. Например, изображение, экстент которого в EPSG: 3857 равен [1684632.9133543067,9544855.787615912,2902401.684702249,10831736.048522325], при добавлении на карту визуализируется следующим образом:
Желательно, чтобы изображение следовало за юго-восточными границами затененного многоугольника. Вместо этого он перекошен и вытянут на северо-восток.
Я был бы очень благодарен за любые идеи и подсказки относительно того, почему это не работает должным образом.
ReferencedEnvelope roiEnvelope = new ReferencedEnvelope(params.roi.getEnvelopeInternal(), DefaultGeographicCRS.WGS84);
Envelope targetEnv = roiEnvelope.transform(input.getCoordinateReferenceSystem2D(), false, 1000);
, гдеparams.roi
- это геометрия EPSG: 4326 JTS. - person tgerdin   schedule 07.04.2020MathTransform defaultToTarget = CRS.findMathTransform(DefaultGeographicCRS.WGS84, input.getCoordinateReferenceSystem2D(), true); Geometry targetRoi = JTS.transform(params.roi, defaultToTarget); Envelope targetEnv = JTS.bounds(targetRoi, input.getCoordinateReferenceSystem());
- person tgerdin   schedule 07.04.2020Envelope dataEnvelope = new ReferencedEnvelope(result.getEnvelope()); CoordinateReferenceSystem mapCRS = CRS.getAuthorityFactory(true).createCoordinateReferenceSystem("EPSG:3857"); MathTransform transform = CRS.findMathTransform(result.getGridGeometry().getCoordinateReferenceSystem(), mapCRS); Envelope targetEnvelope = JTS.transform(dataEnvelope, null, transform, 10000); GridCoverageRenderer renderer = new GridCoverageRenderer(mapCRS, targetEnvelope, result.getGridGeometry().getGridRange2D(), null); ...
- person tgerdin   schedule 07.04.2020