/* * Copyright (c) 2016 Vivid Solutions. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v. 1.0 which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * * http://www.eclipse.org/org/documents/edl-v10.php. */ package org.locationtech.jtstest.util.io; import java.io.FileInputStream; import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.io.ParseException; import org.locationtech.jts.io.WKBHexFileReader; import org.locationtech.jts.io.WKBReader; import org.locationtech.jts.io.WKTFileReader; import org.locationtech.jts.io.WKTReader; import org.locationtech.jts.io.gml2.GMLReader; import org.locationtech.jtstest.testbuilder.io.shapefile.Shapefile; import org.locationtech.jtstest.util.FileUtil; import org.xml.sax.SAXException; public class IOUtil { public static Geometry readFile(String filename, GeometryFactory geomFact) throws Exception, IOException { String ext = FileUtil.extension(filename); if (ext.equalsIgnoreCase(".shp")) return readShapefile(filename, geomFact); if (ext.equalsIgnoreCase(".wkb")) return readWKBHexFile(filename, geomFact); if (ext.equalsIgnoreCase(".gml")) return readGMLFile(filename, geomFact); if (ext.equalsIgnoreCase(".geojson")) return readGeoJSONFile(filename, geomFact); return readWKTFile(filename, geomFact); } private static Geometry readShapefile(String filename, GeometryFactory geomFact) throws Exception { Shapefile shpfile = new Shapefile(new FileInputStream(filename)); shpfile.readStream(geomFact); List geomList = new ArrayList(); do { Geometry geom = shpfile.next(); if (geom == null) break; geomList.add(geom); } while (true); return geomFact.createGeometryCollection(GeometryFactory.toGeometryArray(geomList)); } private static Geometry readGMLFile(String filename, GeometryFactory geomFact) throws ParseException, IOException, SAXException, ParserConfigurationException { return readGMLString(FileUtil.readText(filename), geomFact); } private static Geometry readWKBHexFile(String filename, GeometryFactory geomFact) throws ParseException, IOException { return readWKBHexString(FileUtil.readText(filename), geomFact); } /* private static Geometry readWKBHexString(String wkbHexFile, GeometryFactory geomFact) throws ParseException, IOException { WKBReader reader = new WKBReader(geomFact); String wkbHex = cleanHex(wkbHexFile); return reader.read(WKBReader.hexToBytes(wkbHex)); } */ private static String cleanHex(String hexStuff) { return hexStuff.replaceAll("[^0123456789ABCDEFabcdef]", ""); } private static Geometry readWKTFile(String filename, GeometryFactory geomFact) throws ParseException, IOException { return readWKTString(FileUtil.readText(filename), geomFact); } /** * Reads one or more WKT geometries from a string. * * @param wkt * @param geomFact * @return the geometry read * @throws ParseException * @throws IOException */ public static Geometry readWKTString(String wkt, GeometryFactory geomFact) throws ParseException, IOException { WKTReader reader = new WKTReader(geomFact); WKTFileReader fileReader = new WKTFileReader(new StringReader(wkt), reader); List geomList = fileReader.read(); if (geomList.size() == 1) return (Geometry) geomList.get(0); return geomFact.createGeometryCollection(GeometryFactory.toGeometryArray(geomList)); } public static Geometry readWKBHexString(String wkb, GeometryFactory geomFact) throws ParseException, IOException { WKBReader reader = new WKBReader(geomFact); WKBHexFileReader fileReader = new WKBHexFileReader(new StringReader(wkb), reader); List geomList = fileReader.read(); if (geomList.size() == 1) return (Geometry) geomList.get(0); return geomFact.createGeometryCollection(GeometryFactory.toGeometryArray(geomList)); } public static Geometry readGMLString(String gml, GeometryFactory geomFact) throws ParseException, IOException, SAXException, ParserConfigurationException { GMLReader reader = new GMLReader(); Geometry geom = reader.read(gml, geomFact); return geom; } private static Geometry readGeoJSONFile(String filename, GeometryFactory geomFact) throws ParseException, IOException, SAXException, ParserConfigurationException { return readGeoJSONString(FileUtil.readText(filename), geomFact); } public static Geometry readGeoJSONString(String s, GeometryFactory geomFact) throws ParseException { GeoJsonMultiReader reader = new GeoJsonMultiReader(geomFact); Geometry geom = reader.read(s); return geom; } }