/* * Licensed Materials - Property of Perforce Software, Inc. * © Copyright Perforce Software, Inc. 2014, 2021 * © Copyright IBM Corp. 2009, 2014 * © Copyright ILOG 1996, 2009 * All Rights Reserved. * * Note to U.S. Government Users Restricted Rights: * The Software and Documentation were developed at private expense and * are "Commercial Items" as that term is defined at 48 CFR 2.101, * consisting of "Commercial Computer Software" and * "Commercial Computer Software Documentation", as such terms are * used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4, * as applicable. */ import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.text.DecimalFormat; import java.text.ParseException; import java.util.StringTokenizer; import ilog.views.maps.IlvAttributeInfoProperty; import ilog.views.maps.IlvCoordinate; import ilog.views.maps.IlvFeatureAttributeProperty; import ilog.views.maps.IlvFeatureRenderer; import ilog.views.maps.IlvMapFeature; import ilog.views.maps.IlvMapFeatureIterator; import ilog.views.maps.attribute.IlvStringAttribute; import ilog.views.maps.format.IlvMapFormatException; import ilog.views.maps.geometry.IlvMapLineString; import ilog.views.maps.projection.IlvProjection; import ilog.views.maps.rendering.IlvDefaultCurveRenderer; import ilog.views.maps.srs.coordsys.IlvCoordinateSystem; import ilog.views.maps.srs.coordsys.IlvGeographicCoordinateSystem; /** * Read polylines from simple text files. File format is one point per line, in * the order longitude then latitude in decimal degrees. A third field can * contain a comment to be attached to polyline as a string attribute. Each * field is separated by spaces. A file can contain multiple polylines : each * polyline is separated from another by a blank line. */ class SimplePolylineReader implements IlvMapFeatureIterator { /** * The attribute info for attributes */ private IlvAttributeInfoProperty attributeInfo; /** * A decimal parser to parse decimal numbers */ private DecimalFormat decimalParser; /** * The input stream from which file are read */ private BufferedReader file; /** * Constructs a new PolylineReader to read from file which name is specified. * * @param fileName * the name of file to read */ public SimplePolylineReader(String fileName) throws IOException, IlvMapFormatException { file = new BufferedReader(new FileReader(fileName)); // check file format String line = file.readLine(); if ((line == null) || (!line.trim().equals("# ascii polylines"))) { file.close(); throw new IlvMapFormatException("Wrong format"); } // to parse coordinates decimalParser = new DecimalFormat(); // Build attribute info String attributeNames[] = { "Comment" }; Class<?> attributeClasses[] = { IlvStringAttribute.class }; boolean attributeNullable[] = { true }; attributeInfo = new IlvAttributeInfoProperty(attributeNames, attributeClasses, attributeNullable); } /** * Release the resources allocated by the feature iterator */ Override public void dispose() { if (file != null) { try { file.close(); } catch (IOException exception) { /* DO NOTHING */ } } } /** * Returns next feature from collection, or null if no more feature is * available. */ Override public IlvMapFeature getNextFeature() throws IOException { return readPolyline(); } /** * Returns true if the reader can provide the source projection of its map * features. */ Override public boolean isGeoreferenced() { return true; } /** * Returns the projection of the features */ public IlvProjection getProjection() { return null; // DEPRECATED } /** * Returns the coordinate system of the features */ Override public IlvCoordinateSystem getCoordinateSystem() { return IlvGeographicCoordinateSystem.WGS84; } /** * Returns the upper left corner of the feature list. */ Override public IlvCoordinate getUpperLeftCorner() { return null; } /** * Returns the lower right corner of the feature list. */ Override public IlvCoordinate getLowerRightCorner() { return null; } /** * Returns the default renderer for the map features. */ Override public IlvFeatureRenderer getDefaultFeatureRenderer() { return new IlvDefaultCurveRenderer(); } /** * Reads the polyline from file */ private IlvMapFeature readPolyline() throws IOException { // a buffer to concatenate all comments for a polyline StringBuffer buffer = new StringBuffer(); // the current read feature IlvMapFeature feature = new IlvMapFeature(); // the current read line string geometry IlvMapLineString geometry = new IlvMapLineString(); // to store the line of text that is read String line; // read a line while ((line = file.readLine()) != null) { line = line.trim(); if (line.length() == 0) { break; } // for analyse of the line StringTokenizer tokenizer = new StringTokenizer(line, " \t"); String currentToken; // process longitude IlvCoordinate c = new IlvCoordinate(); if (tokenizer.hasMoreElements() == false) throw new IlvMapFormatException("Longitude coordinate expected"); try { currentToken = (String) tokenizer.nextElement(); c.x = decimalParser.parse(currentToken).doubleValue(); } catch (ParseException e) { throw new IlvMapFormatException("Error while parsing longitude"); } // process latitude if (tokenizer.hasMoreElements() == false) throw new IlvMapFormatException("Latitude coordinate expected"); try { currentToken = (String) tokenizer.nextElement(); c.y = decimalParser.parse(currentToken).doubleValue(); } catch (ParseException e) { throw new IlvMapFormatException("Error while parsing latitude"); } // process comment while (tokenizer.hasMoreElements()) { buffer.append((String) tokenizer.nextElement()); buffer.append(" "); } // add this point to geometry geometry.addPoint(c); } // Case of end of file if ((line == null) && (geometry.getPointCount() == 0)) return null; // Initialize feature feature.setGeometry(geometry); // Set attribute IlvStringAttribute[] attribute = new IlvStringAttribute[1]; if (buffer.length() > 0) { attribute[0] = new IlvStringAttribute(); attribute[0].setString(buffer.toString()); } else { attribute[0] = null; } feature.setAttributeInfo(attributeInfo); feature.setAttributes(new IlvFeatureAttributeProperty(attributeInfo, attribute)); // return the read feature return feature; } }