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.
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:
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.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();
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()) {
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) {}
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