5 votos

Cómo conseguir coordinar el sistema de información de shapefile el uso de GDAL/OGR?

GDAL versión 2.1.1

Si puedo abrir una geoespacial de archivo raster, tales como GeoTIFF o archivo DTED, con GDAL, luego puedo conseguir el sistema de coordenadas de información del archivo, como una cadena en OpenGIS formato WKT. Por ejemplo:

GEOGCS["WGS 84",
    DATUM["WGS_1984",
        SPHEROID["WGS 84",6378137,298.257223563]],
    PRIMEM["Greenwich",0],
    UNIT["degree",0.0174532925199433],
    AUTHORITY["EPSG","4326"]]

El código de C++ que uso para conseguir que la información es sencilla y directa.

string path = "somewhere.dt1";
unsigned int openFlags = GA_ReadOnly;
GDALDataset * pDataset = static_cast<GDALDataset *>( GDALOpenEx(
    path.c_str(),
    openFlags,
    NULL, NULL, NULL ) );

string projWkt = pDataset->GetProjectionRef();

OGRSpatialReference srs( projWkt.c_str() );
srs.dumpReadable();

Sin embargo, cuando abro un geoespacial vector de archivo, como un archivo shapefile, con GDAL, sólo obtengo una cadena en blanco para el sistema de coordenadas de información. La única diferencia en el código de C++ que yo uso es que yo también deben proporcionar la GDAL_OF_VECTOR indicador GDALOpenEx().

string path = "elsewhere.shp";
unsigned int openFlags = GA_ReadOnly | GDAL_OF_VECTOR;
GDALDataset * pDataset = static_cast<GDALDataset *>( GDALOpenEx(
    path.c_str(),
    openFlags,
    NULL, NULL, NULL ) );

El shapefile estoy de apertura tiene un válido sistema de coordenadas. Puedo confirmar que, al abrir el archivo shapefile en ArcMap o ArcCatalog. Ambas aplicaciones son capaces de decirme el sistema de coordenadas y proyección de la información.

Así que, ¿por qué no soy capaz de ir a través de este GDAL API?

Hay un mecanismo diferente para los archivos vectoriales?

5voto

Lucas Puntos 128

Hay un mecanismo diferente para los archivos vectoriales?

Sí. Aunque el vector y raster conductores se fusionaron en GDAL 2x, usted todavía necesita saber que métodos se aplican a los rásteres y que son para los vectores. Confusamente, vector de orígenes de datos ahora exponer los métodos que sólo se aplican a los rásteres de...

El GetProjectionRef método que está utilizando se aplica a los orígenes de datos raster y es necesario utilizar el método vector GetSpatialRef (que devuelve una referencia espacial del objeto, no WKT...).

Esto funciona para que el vector (código de python):

from osgeo import gdal, ogr

f = r'/path/to/shapefile.shp'

ds = gdal.OpenEx(f, gdal.OF_VECTOR) #gdal.OF_VECTOR is not required, but speeds things up as only vector drivers are tried
print('"%s"'%ds.GetLayer().GetSpatialRef().ExportToWkt())

3voto

Leviculus Puntos 18

Basado en la respuesta de @Lucas, el siguiente es mi implementación en C++.

Puedo detectar si el archivo raster o vector, utilizando una función de utilidad mencionado en otro post también respondió por @Lucas.

string path = "elsewhere.shp";
Format::Enum format = GetFileFormat( path );

He abierto el archivo.

GDALDataset * pDataset = NULL;
if ( format == Format::RASTER )
{
  unsigned int openFlags = GA_ReadOnly;
  pDataset = static_cast<GDALDataset *>( GDALOpenEx( inPath.c_str(), openFlags, NULL, NULL, NULL ) );
}
else if ( format == Format::VECTOR )
{
  unsigned int openFlags = GA_ReadOnly | GDAL_OF_VECTOR;
  pDataset = static_cast<GDALDataset *>( GDALOpenEx( inPath.c_str(), openFlags, NULL, NULL, NULL ) );
}

Tengo el sistema de referencia espacial para el archivo.

OGRSpatialReference srs;
if ( format == Format::RASTER )
{
  char const * szWkt = pDataset->GetProjectionRef();
  srs.importFromWkt( (char **)( &szWkt ) );
}
else if ( format == Format::VECTOR )
{
  // Assume just one vector layer in the dataset for now.
  OGRSpatialReference * pOrigSrs = pDataset->GetLayer( 0 )->GetSpatialRef();
  if ( pOrigSrs )
  {
    srs = *pOrigSrs;
  }
}

Ahora puedo hacer lo que quiero desde el sistema de referencia espacial.

if ( srs.IsProjected() )
{
  ...
}

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