3 votos

Convertir la imagen de un CRS definido por la EPSG a otro

Tengo muchos archivos de imagen (.png o .jpg) que quiero convertir de un sistema CRS definido por EPSG a otro, por ejemplo, de EPSG:31255 a EPSG:25833 en un servidor dentro de una aplicación Java.

Para cada imagen conozco las coordenadas (x,y) de la esquina inferior izquierda y superior derecha en ese sistema CRS específico.

Lo que he encontrado hasta ahora:

  • QGIS: Es capaz de hacer esto pero tendría que hacerlo a mano ( respuesta )
  • GDAL : Es capaz de convertir imágenes pero utiliza C++ (que no puedo utilizar en el servidor)
  • Proj4js : Sólo puede convertir coordenadas
  • Geotools: Sólo he encontrado información sobre la conversión coordenadas o completo shapefiles hasta ahora.

¿Puede GeoTools convertir imágenes también o qué otra biblioteca Java/JavaScript puede hacerlo?

Editar:

Actualmente estoy usando la versión 22.2 de GeoTools. Las dependencias en el archivo pom.xml son:

  • junit
  • gt-shapefile
  • gt-swing
  • gt-geotiff
  • gt-image (no sé si lo necesito)
  • gt-epsg-hsql

Las importaciones en el archivo java son:

  • importar org.geotools.coverage.grid.GridCoverage2D;
  • importar org.geotools.coverage.grid.io.AbstractGridCoverage2DReader;
  • importar org.geotools.coverage.grid.io.AbstractGridFormat;
  • importar org.geotools.coverage.grid.io.GridFormatFinder;
  • importar org.geotools.coverage.processing.Operations;
  • importar org.geotools.gce.geotiff.GeoTiffFormat;
  • importar org.geotools.gce.geotiff.GeoTiffWriter;
  • importar org.geotools.referencing.CRS;
  • importar org.geotools.util.factory.Hints;
  • import org.opengis.referencing.crs.CoordinateReferenceSystem;

3voto

Adam Ernst Puntos 6939

Si tiene un .wld y .prj entonces el gt-image puede leer y escribir archivos jpeg y png.

Una vez que haya leído el archivo en un GridCoverage puedes reproyectarlo y escribirlo sin dificultad:

AbstractGridFormat format = GridFormatFinder.findFormat(input);
Hints hints = null;
if (format instanceof GeoTiffFormat) {
  hints = new Hints(Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, Boolean.TRUE);
}

AbstractGridCoverage2DReader reader = format.getReader(input, hints);
GridCoverage2D coverage = reader.read(null);
reader.dispose();
GridCoverage2D coverageTransf = (GridCoverage2D) Operations.DEFAULT.resample(coverage, targetCRS);

GeoTiffFormat outFormat = new GeoTiffFormat();
GridCoverageWriter writer = outFormat.getWriter(destFile, hints);
writer.write(coverageTransf, null);
writer.dispose();

Suponiendo que su imagen de entrada esté en input Su SIR objetivo está en targetCRS y el archivo de salida está en destFile .

PS: ver la entrada de mi blog sobre cómo añadir un .prj archivo a un montón de imágenes del mundo si faltan.

0voto

UbuntuCake Puntos 3

Algunas informaciones adicionales:

Para conseguir que el código de la respuesta de Ian Turton (GeoTools 22.2, Java 8) se ejecute correctamente tuve que añadir las siguientes dependencias al pom.xml archivo:

<dependency>
    <groupId>org.geotools</groupId>
    <artifactId>gt-geotiff</artifactId>
    <version>${geotools.version}</version>
</dependency>
<dependency>
    <groupId>org.geotools</groupId>
    <artifactId>gt-image</artifactId>
    <version>${geotools.version}</version>
</dependency>
<dependency>
    <groupId>org.geotools</groupId>
    <artifactId>gt-epsg-hsql</artifactId>
    <version>${geotools.version}</version>
</dependency>

¿Por qué?

  • gt-geotiff : Utilizado para GeoTiffFormat (Error: GeoTiffFormat cannot be resolved to a type )
  • gt-image : Sin usted conseguirá Trying to get a reader from an unknown format. con AbstractGridCoverage2DReader reader = format.getReader(input, hints)
  • gt-epsg-hsql : De lo contrario, obtendrá: org.opengis.referencing.NoSuchAuthorityCodeException: No code "EPSG:25833" from authority "EPSG" found for object of type "EngineeringCRS".
  • También he añadido gt-coverage al principio, pero la aplicación parece funcionar bien sin ella.

También tuve que deshacerme del Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER Si no, las imágenes de salida se reflejarían y rotarían 90°. Esto parece depender del archivo .prj utilizado:

El archivo (para "EPSG:31255") lo descargué de epsg.io (¡utiliza la exportación "Well Known Text as HTML" y cambia el nombre!) funciona bien ya que incluye "TOWGS84". El archivo .prj que obtuve de spatialreference.org también incluye ese código, pero sigue produciendo un resultado erróneo (aunque no he probado su versión "WKT como HTML").

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X