From: <lpe...@sv...> - 2005-08-31 23:19:50
|
Author: lpercich Date: 2005-08-31 16:19:45 -0700 (Wed, 31 Aug 2005) New Revision: 15561 Added: geotools/trunk/gt/plugin/mif/test/org/geotools/data/mif/test-data/text= .MID geotools/trunk/gt/plugin/mif/test/org/geotools/data/mif/test-data/text= .MIF Modified: geotools/trunk/gt/plugin/mif/src/org/geotools/data/mif/MIFFile.java geotools/trunk/gt/plugin/mif/test/org/geotools/data/mif/MIFFileTest.ja= va Log: MIF: added basic support for text objects; Modified: geotools/trunk/gt/plugin/mif/src/org/geotools/data/mif/MIFFile.= java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- geotools/trunk/gt/plugin/mif/src/org/geotools/data/mif/MIFFile.java 2= 005-08-31 23:04:40 UTC (rev 15560) +++ geotools/trunk/gt/plugin/mif/src/org/geotools/data/mif/MIFFile.java 2= 005-08-31 23:19:45 UTC (rev 15561) @@ -27,6 +27,7 @@ import com.vividsolutions.jts.geom.Polygon; import com.vividsolutions.jts.geom.PrecisionModel; import com.vividsolutions.jts.geom.TopologyException; +import com.vividsolutions.jts.io.ParseException; import org.geotools.data.FeatureReader; import org.geotools.data.FeatureWriter; import org.geotools.feature.AttributeType; @@ -88,10 +89,10 @@ private static final String TYPE_LINE =3D "line"; private static final String TYPE_PLINE =3D "pline"; private static final String TYPE_REGION =3D "region"; + private static final String TYPE_TEXT =3D "text"; =20 // The following object types are still not supported private static final String TYPE_ARC =3D "arc"; - private static final String TYPE_TEXT =3D "text"; private static final String TYPE_RECT =3D "rect"; // could be conver= ted to polygon private static final String TYPE_ROUNDRECT =3D "roundrect"; private static final String TYPE_ELLIPSE =3D "ellipse"; @@ -100,12 +101,18 @@ private static final String TYPE_MULTIPOINT =3D "multipoint"; private static final String TYPE_COLLECTION =3D "collection"; =20 - // String Style Constants=20 + // String Style Constants =20 private static final String CLAUSE_SYMBOL =3D "symbol"; private static final String CLAUSE_PEN =3D "pen"; private static final String CLAUSE_SMOOTH =3D "smooth"; private static final String CLAUSE_CENTER =3D "center"; private static final String CLAUSE_BRUSH =3D "brush"; + private static final String CLAUSE_FONT =3D "font"; + private static final String CLAUSE_ANGLE =3D "angle"; + private static final String CLAUSE_JUSTIFY =3D "justify"; + private static final String CLAUSE_SPACING =3D "spacing"; + private static final String CLAUSE_RIGHT =3D "right"; + private static final String CLAUSE_LABEL =3D "label"; =20 // Header parse Constants (& parameter names)=20 private static final String CLAUSE_COLUMNS =3D "columns"; @@ -189,7 +196,9 @@ * PARAM_GEOMTYPE =3D geometry type handling: "untyped" uses Geometr= y class | * "typed" force geometry to the type of the first valid geometry fo= und in * file | "multi" like typed, but forces LineString to MultilineStri= ng and - * Polygon to MultiPolygon; | "Point" | "LineString" | "MultiLineStr= ing" | "Polygon" | "MultiPolygon" + * Polygon to MultiPolygon; | "Point" | "LineString" | "MultiLineStr= ing" | + * "Polygon" | "MultiPolygon" | "Text" forces Geometry to Point and + * creates a MIF_TEXT String field in the schema * </li> * </ul> *=20 @@ -716,6 +725,7 @@ throws IOException, SchemaException { try { String tok; + boolean hasMifText =3D false; AttributeType[] columns =3D null; =20 while (mif.readLine()) { @@ -878,6 +888,9 @@ toGeometryCollection =3D true; } else if (geomClass.equals("point")) { geomType =3D Point.class; + } else if (geomClass.equals("text")) { + geomType =3D Point.class; + hasMifText =3D true; } else if (geomClass.equals("linestring")) { geomType =3D LineString.class; } else if (geomClass.equals("multilinestring")) { @@ -900,6 +913,7 @@ =20 while (!reader.mifEOF) { geom =3D reader.readGeometry(); + hasMifText =3D (!reader.mifText.equals("")); =20 if (geom !=3D null) { geomType =3D geom.getClass(); @@ -940,6 +954,11 @@ for (int i =3D 0; i < columns.length; i++) builder.addType(columns[i]); =20 + if (hasMifText) { + builder.addType(AttributeTypeFactory.newAttribut= eType( + "MIF_TEXT", String.class, true)); + } + setSchema(builder.getFeatureType()); } catch (SchemaException schexp) { throw new SchemaException( @@ -1162,6 +1181,7 @@ private MIFFileTokenizer mif =3D null; private MIFFileTokenizer mid =3D null; private boolean mifEOF =3D false; + private String mifText =3D ""; // caption for text objects=20 private Feature inputFeature =3D null; private Object[] inputBuffer =3D null; private MIFValueSetter[] fieldValueSetters; @@ -1272,6 +1292,14 @@ inputBuffer[col] =3D fieldValueSetters[col].getValue= (); } =20 + if (!mifText.equals("")) { + // MIF_TEXT MUST BE the LAST Field for now + inputBuffer[++col] =3D mifText; + + // a better approach could be using a separate array= of value setters for MIF_ fields + // (TEXT, ANGLE...) + } + if (col !=3D (numAttribs - 1)) { throw new Exception( "Bad number of attributes read on MID row " @@ -1303,6 +1331,8 @@ * @throws IOException Error retrieving geometry from input MIF = stream */ private Geometry readGeometry() throws IOException { + mifText =3D ""; + if (!mif.readLine()) { mifEOF =3D true; =20 @@ -1325,11 +1355,18 @@ geom =3D readPLineObject(); } else if (objType.equals(TYPE_REGION)) { geom =3D readRegionObject(); + } else if (objType.equals(TYPE_TEXT)) { + geom =3D readTextObject(); } else if (objType.equals(CLAUSE_PEN) || objType.equals(CLAUSE_SYMBOL) || objType.equals(CLAUSE_SMOOTH) || objType.equals(CLAUSE_CENTER) - || objType.equals(CLAUSE_BRUSH)) { + || objType.equals(CLAUSE_BRUSH) + || objType.equals(CLAUSE_FONT) + || objType.equals(CLAUSE_ANGLE) + || objType.equals(CLAUSE_JUSTIFY) + || objType.equals(CLAUSE_SPACING) + || objType.equals(CLAUSE_LABEL)) { // Symply ignores styling clauses, so let's read the= next lines geom =3D readGeometry(); } else { @@ -1431,10 +1468,10 @@ tmpRing =3D geomFactory.createLinearRing(coords); =20 /* - * In MIF format a polygon is described as a list of= rings, with no info wether=20 - * a ring is a hole or a shell, so we have to determ= ine it by checking if=20 + * In MIF format a polygon is described as a list of= rings, with no info wether + * a ring is a hole or a shell, so we have to determ= ine it by checking if * a ring in contained in the previously defined she= ll - */ =20 + */ if ((shell !=3D null) && shell.contains(tmpRing)) { holes.add(tmpRing); tmpRing =3D null; // mark as done @@ -1562,6 +1599,20 @@ =20 return result[0]; } + + private Geometry readTextObject() throws IOException { + try { + mifText =3D mif.getToken(' ', true, true); + } catch (ParseException e) { + throw new IOException(e.getMessage()); + } + + Coordinate c1 =3D readMIFCoordinate(); + Coordinate c2 =3D readMIFCoordinate(); + Coordinate p =3D new Coordinate((c1.x + c2.x) / 2, (c1.y + c= 2.y) / 2); + + return geomFactory.createPoint(p); + } } =20 /** Modified: geotools/trunk/gt/plugin/mif/test/org/geotools/data/mif/MIFFile= Test.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- geotools/trunk/gt/plugin/mif/test/org/geotools/data/mif/MIFFileTest.j= ava 2005-08-31 23:04:40 UTC (rev 15560) +++ geotools/trunk/gt/plugin/mif/test/org/geotools/data/mif/MIFFileTest.j= ava 2005-08-31 23:19:45 UTC (rev 15561) @@ -399,6 +399,14 @@ doTestTyping("nodi", "Point", Point.class, false); } =20 + public void testTypedGeometryText() { + doTestTyping("text", "Text", Point.class, false); + } + + public void testTypedGeometryTextAuto() { + doTestTyping("text", "Typed", Point.class, false); + } + /** * DOCUMENT ME! */ Added: geotools/trunk/gt/plugin/mif/test/org/geotools/data/mif/test-data/= text.MID =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- geotools/trunk/gt/plugin/mif/test/org/geotools/data/mif/test-data/tex= t.MID 2005-08-31 23:04:40 UTC (rev 15560) +++ geotools/trunk/gt/plugin/mif/test/org/geotools/data/mif/test-data/tex= t.MID 2005-08-31 23:19:45 UTC (rev 15561) @@ -0,0 +1,3 @@ +1,"This is text 1" +2,"...And text 2" +3,"...and text 3" Added: geotools/trunk/gt/plugin/mif/test/org/geotools/data/mif/test-data/= text.MIF =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- geotools/trunk/gt/plugin/mif/test/org/geotools/data/mif/test-data/tex= t.MIF 2005-08-31 23:04:40 UTC (rev 15560) +++ geotools/trunk/gt/plugin/mif/test/org/geotools/data/mif/test-data/tex= t.MIF 2005-08-31 23:19:45 UTC (rev 15561) @@ -0,0 +1,27 @@ +Version 300 +Charset "WindowsLatin1" +Delimiter "," +CoordSys Earth Projection 8, 87, "m", 9, 0, 0.9996, 1500000, 0 Bounds (-= 6746230.6469, -9998287.38389) (9746230.6469, 9998287.38389) +Columns 2 + ID Integer + CAPTION Char(64) +Data + +Text + "This is text 1" + 1515290.03 5033828.93 1515640.52 5033889.78 + Font ("Arial",1,0,0) + +Text + "...And text 2\nwith a CRLF char" + 1516511.11 5032920.22 1516968.71 5033041.92 + Font ("Arial",0,0,0) + Angle 270 + +Text + "...and text 3" + 1514928.98 5032425.28 1515454.76 5032498.3 + Font ("Verdana",1,0,0) + Angle 34 + Justify Center + |