lunes, 21 de mayo de 2012

Lectura de archivos shapefile con GeoTools



GeoTools que es una biblioteca SIG de código libre que permite desarrollar soluciones adaptadas a los estándares proporcionando una implementación de las especificaciones del Open Geospatial Consortium (OGC) según van apareciendo. Es decir, que no solo permite la lectura archivos Shapefile sino que dispone de otras muchas funcionalidades entre las que destacan:
  • Lectura y escritura de otros formatos como GeoTiff, GML,  Jpeg, Png, etc...
  • Acceso a servicios web de datos geoespaciales como WMS, WFS, etc...
  • Proporciona estructuras para trabajo con datos geoespaciales, 
  • Realización de operaciones sobre datos espaciales.
  • Manejo y cambio entre sistemas de coordenadas.
  • Renderizado de datos.
  • Creación de interfaces de usuario.
Requisitos y configuración

Para poder trabajar con GeoTools tan solo debemos bajarnos la ultima versión (a día de hoy 2.7.4) y configurar nuestro IDE favorito importando las librerías que necesitemos que en nuestro caso será gt-shapefile-2.7.4.jar.

Código

En primer lugar deberemos realizar los siguientes imports que incluyen tanto las clases necesarias para cargar los shapefiles como para definir la geometría leída y los datos:

import java.io.File;
import java.util.HashMap;
import java.util.Map;

import org.geotools.data.DataStore;
import org.geotools.data.DataStoreFinder;
import org.geotools.data.FeatureSource;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.FeatureIterator;
import org.opengis.feature.Feature;

import com.vividsolutions.jts.geom.GeometryCollection;



Y ya podemos pasar a realizar la apertura del fichero que en nuestro caso sera un fichero de polígonos (los shapefiles pueden ser de puntos, polilíneas o poligonos). Por tanto a la hora de trabajar con un shapefile tenemos que tener en cuenta su geometría y ademas como contiene datos en forma de cadena (es decir string) debemos tener en cuenta tamien su codificación. Así para abrir un fichero en que esta en utf-8 debemos escribir:

  // Definición del fichero al shapefile (es decir el que tiene la extensión .shp) de entre los que forman el shapefile (ver wikipedia para mas info).
 File file = new File("buildings.shp");
 Map connect = new HashMap();
  // Se establecen los parametros para abrir el fichero.
 connect.put("url", file.toURL());
 connect.put("charset", "utf-8");
 // Se abre el shapefile como almacen de datos.
 DataStore dataStore = DataStoreFinder.getDataStore(connect);
 String[] typeNames = dataStore.getTypeNames();
 String typeName = typeNames[0];

 System.out.println("Reading content " + typeName);
 // Se cargan datos y geometria
 FeatureSource featureSource = dataStore.getFeatureSource(typeName);
 FeatureCollection collection = featureSource.getFeatures();
 FeatureIterator iterator = collection.features();
 // Se recorre cada uno de los registros y se escribe el contenido en este caso un campo llamado name (que es una de las columnas del shapfile leído
try {
 while (iterator.hasNext()) {
  Feature feature = iterator.next();
  if (!feature.getProperty("name").getValue().toString().isEmpty()) {
             
    System.out.println(String.valueOf(feature.getProperty("name").getValue()));    GeometryCollection geo = (GeometryCollection)  feature.getDefaultGeometryProperty().getValue();
            
     // Se lee cada punto del polígono y se escribe
     for (int nC=0; nC < geo.getCoordinates().length; nC++) {
        System.out.println("\t" + String.valueOf(geo.getCoordinates()[nC].x)+
                           ", " + String.valueOf(geo.getCoordinates()[nC].y));
     }
   }     
         
 }
} finally {
    iterator.close();
} catch (Throwable e) {}


No hay comentarios:

Publicar un comentario