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"