3 votos

Extracción de valores Z de SHP con geotools y vividsolutions?

Utilizo las bibliotecas java geotools y vividsolutions para extraer datos xyz de un shapefile (Viena de este ejemplo).

Esto funciona perfectamente bien para los datos x e y, pero todos los valores de coordenadas para z se establecen en "NaN" (no es un número), al igual que para Shapefiles 2D regulares. He encontrado otras preguntas relacionadas con Z = 0, pero creo que este es muy diferente, ya que se trata de diferentes herramientas, y el archivo de origen ya contiene Z-Valores (como se puede ver en el ejemplo ).

Usando el siguiente código, puedo extraer con éxito los valores x e y de las coordenadas, pero coordinate.z siempre da "NaN". Como sé que el shapefile en cuestión contiene valores z, el problema debe estar en geotools/vividsolutions (o en mi uso de esas librerías). Así que, mi pregunta es, ¿alguien sabe cómo leer el valor de la coordenada Z utilizando geotools & vivdsolutions?

Como referencia, véase a continuación el código (condensado) que utilicé para extraer las coordenadas.

Obtención de las geometrías a partir de Shapefile:

public List<Geometry> getShapefileGeometries(File shpFile) throws MalformedURLException, IOException {
    List<Geometry> shpGeometries = null;
    Map<String, Object> mapConnectionTypeInfo = new HashMap<>();
        mapConnectionTypeInfo.put("url", shpFile.toURI().toURL());
        DataStore myDataStore = DataStoreFinder.getDataStore(mapConnectionTypeInfo);
        String typeName = myDataStore.getTypeNames()[0];
        FeatureSource<SimpleFeatureType, SimpleFeature> dataSource = myDataStore.getFeatureSource(typeName);
        FeatureCollection<SimpleFeatureType, SimpleFeature> featureCollection = dataSource.getFeatures();
        Object[] featureObjects = featureCollection.toArray();            
        if (featureObjects != null) {
            shpGeometries = new ArrayList<>();
            for (Object featureObject : featureObjects) {
                SimpleFeature feature = (SimpleFeature) featureObject;
                Object defaultGeometry = feature.getDefaultGeometry();
                if (defaultGeometry != null && defaultGeometry instanceof Geometry) {
                    shpGeometries.add((Geometry) defaultGeometry);
                }
            }
        }         
    return shpGeometries;
}

Búsqueda de coordenadas con valores Z en geometrías:

public void checkGeometriesForZ(List<Geometry> shpGeometries) {
    for (Geometry currentGeometry : shpGeometries) {
        for (int i = 0; i < currentGeometry.getNumGeometries(); i++) {
            Geometry g = currentGeometry.getGeometryN(i);
            Coordinate[] coordinates = null;
            if (g instanceof Polygon) coordinates = ((Polygon) g).getCoordinates();                
            if (g instanceof LineString) coordinates = ((LineString) g).getCoordinates();                
            if (g instanceof Point) coordinates = ((Point) g).getCoordinates();                
            if (coordinates != null) {
                for (Coordinate currentCoordinate : coordinates) {
                    System.out.println(String.format("X: %f, Y: %f, Z: %f", currentCoordinate.x, currentCoordinate.y, currentCoordinate.z));
                }
            }
        }
    }
}

Pruebas (utilizando el shapefile de Viena del ejemplo ):

@Test
public void searchSHPWithZ() throws IOException {
    File vienna = new File("shapefiles/105082_bkm.shp");
    CoordinateExtraction mySearch = new CoordinateExtraction();
    List<Geometry> currentGeometries = mySearch.getShapefileGeometries(vienna);
    mySearch.checkGeometriesForZ(currentGeometries);
}

Salida típica:

"X: 2963,808248, Y: 341051,336212, Z: NaN"

2voto

Adam Ernst Puntos 6939

El shapefile en cuestión no parece contener valores Z en las coordenadas, contiene la información en atributos.

El Shapefile contiene los siguientes atributos relevantes para la visualización 3D

O_KOTE: altura absoluta del edificio medida hasta el canalón del tejado ("absolute Gebäudehöhe der Dachtraufe")

U_KOTE: altura absoluta del borde inferior del bloque de construcción si flota sobre el suelo ("absolute Überbauungshöhe unten")

HOEHE_DGM: altura absoluta del terreno ("absolute Geländehöhe")

T_KOTE: punto más bajo del terreno para el bloque de construcción dado ("punto más bajo del terreno en los bordes de la subárea de construcción").

Así que para acceder a la altura absoluta del edificio (por ejemplo) puedes hacer algo como:

FileDataStore ds = FileDataStoreFinder.getDataStore(new File("/home/ian/Downloads/105082_bkm.shp"));
SimpleFeatureCollection features = ds.getFeatureSource().getFeatures();
try (SimpleFeatureIterator iter = features.features()) {
  while (iter.hasNext()) {
    SimpleFeature f = iter.next();
      Object attribute = f.getAttribute("O_KOTE");
      if (attribute != null) {
        double height = (double) attribute;
        //do whatever with height
    }
  }
}

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