Author: rschulz Date: 2005-06-16 21:10:56 -0700 (Thu, 16 Jun 2005) New Revision: 14558 Added: geotools/trunk/gt/demo/referencing/ geotools/trunk/gt/demo/referencing/src/ geotools/trunk/gt/demo/referencing/src/org/ geotools/trunk/gt/demo/referencing/src/org/geotools/ geotools/trunk/gt/demo/referencing/src/org/geotools/demo/ geotools/trunk/gt/demo/referencing/src/org/geotools/demo/referencing/ geotools/trunk/gt/demo/referencing/src/org/geotools/demo/referencing/C= TSTutorial.java geotools/trunk/gt/demo/referencing/src/org/geotools/demo/referencing/T= ransformData.java geotools/trunk/gt/demo/referencing/src/org/geotools/demo/referencing/T= ransformationConsole.java geotools/trunk/gt/demo/referencing/src/org/geotools/demo/referencing/T= ransformationCoordinateFilter.java Log: moved from migrate Added: geotools/trunk/gt/demo/referencing/src/org/geotools/demo/referenci= ng/CTSTutorial.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/demo/referencing/src/org/geotools/demo/referencing/= CTSTutorial.java 2005-06-16 23:27:39 UTC (rev 14557) +++ geotools/trunk/gt/demo/referencing/src/org/geotools/demo/referencing/= CTSTutorial.java 2005-06-17 04:10:56 UTC (rev 14558) @@ -0,0 +1,346 @@ +/* + * Geotools dependancies: + * main-2.1.x.jar + *=20 + * Other dependancies: + * geoapi-2.0.jar + * units-0.01.jar + * vecmath-1.3.jar + *=20 + */ +package org.geotools.demo.referencing; + +//J2SE dependancies +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import javax.units.NonSI; +import javax.units.SI; + +//GeoAPI dependencies +import org.opengis.referencing.FactoryException; +//import org.opengis.referencing.NoSuchIdentifierException; +import org.opengis.referencing.crs.*; +import org.opengis.referencing.operation.*; +import org.opengis.referencing.cs.AxisDirection; +import org.opengis.referencing.cs.CSFactory; +import org.opengis.referencing.cs.CartesianCS; +import org.opengis.referencing.cs.CoordinateSystemAxis; +import org.opengis.referencing.cs.EllipsoidalCS; +import org.opengis.referencing.datum.DatumFactory; +import org.opengis.referencing.datum.Ellipsoid; +import org.opengis.referencing.datum.GeodeticDatum; +import org.opengis.referencing.datum.PrimeMeridian; +import org.opengis.referencing.datum.VerticalDatum; +import org.opengis.referencing.datum.VerticalDatumType; +import org.opengis.spatialschema.geometry.DirectPosition; +import org.opengis.spatialschema.geometry.MismatchedDimensionException; +//import org.opengis.referencing.datum.GeodeticDatum; +import org.opengis.parameter.ParameterValueGroup; +import org.opengis.referencing.IdentifiedObject; +import org.opengis.metadata.Identifier; +import org.opengis.util.GenericName; + +// Geotools dependencies +import org.geotools.geometry.GeneralDirectPosition; +import org.geotools.referencing.FactoryFinder; +import org.geotools.referencing.factory.FactoryGroup; + +/** + * @author rschulz + * + * Code for the geotools coordinate transformation services tutorial. Th= ese examples + * cover the following topics: + * <ul> + * <li>creating coordinate reference systems (CRS) by hand</li> + * <li>creating CRS's from well known text (WKT) strings</li> + * <li> </li> + * <li> </li> + * <li> </li> + * <li> </li>=20 + * </ul> + */ +public class CTSTutorial { +=09 + private CRSFactory crsFactory =3D null; + private MathTransformFactory mtFactory =3D null; + private FactoryGroup factories =3D null; +=09 + private CoordinateReferenceSystem geocentricCRS =3D null; + private CoordinateReferenceSystem airyCRS =3D null; +=09 + CTSTutorial() { + try { + crsFactory =3D FactoryFinder.getCRSFactory(null); + mtFactory =3D FactoryFinder.getMathTransformFactory(null); + factories =3D new FactoryGroup(); + creatCRSFromWKT(); + createCRSByHand1(); + createCRSByHand2(); + createAndUseMathTransform(); + } catch (Exception e) { + e.printStackTrace(); + } + } +=09 + /** + * An example of creating a CRS from a WKT string. Additonal examples o= f WKT strings + * can be found ________________ + *=20 + * Brief description of what a CRS is (and what it is composed of) + *=20 + * @throws Exception + */ + void creatCRSFromWKT() throws Exception { + System.out.println("------------------------------------------");=20 + System.out.println("Creating a CRS from a WKT string:"); + + String wkt =3D "PROJCS[\"UTM_Zone_10N\", " + + "GEOGCS[\"WGS84\", " + + "DATUM[\"WGS84\", " + + "SPHEROID[\"WGS84\", 6378137.0, 298.257223563]], = " + + "PRIMEM[\"Greenwich\", 0.0], " + + "UNIT[\"degree\",0.017453292519943295], " + + "AXIS[\"Longitude\",EAST], " + + "AXIS[\"Latitude\",NORTH]], " + + "PROJECTION[\"Transverse_Mercator\"], " + + "PARAMETER[\"semi_major\", 6378137.0], " + + "PARAMETER[\"semi_minor\", 6356752.314245179], " + + "PARAMETER[\"central_meridian\", -123.0], " + + "PARAMETER[\"latitude_of_origin\", 0.0], " + + "PARAMETER[\"scale_factor\", 0.9996], " + + "PARAMETER[\"false_easting\", 500000.0], " + + "PARAMETER[\"false_northing\", 0.0], " + + "UNIT[\"metre\",1.0], " + + "AXIS[\"x\",EAST], " + + "AXIS[\"y\",NORTH]]"; + + CoordinateReferenceSystem crs =3D crsFactory.createFromWKT(wkt); + System.out.println(" CRS: " + crs.toWKT()); + =09 + System.out.println("------------------------------------------");=20 + } +=09 + /** + *=20 + *=20 + * @throws Exception + */ + void createCRSByHand1() throws Exception { + System.out.println("------------------------------------------");=20 + System.out.println("Creating a CRS by hand:"); + MathTransformFactory mtFactory =3D FactoryFinder.getMathTransformFacto= ry(null); + + GeographicCRS geoCRS =3D org.geotools.referencing.crs.DefaultGeographi= cCRS.WGS84; + CartesianCS cartCS =3D org.geotools.referencing.cs.DefaultCartesianCS.= GENERIC_2D; + + ParameterValueGroup parameters =3D mtFactory.getDefaultParameters("Tra= nsverse_Mercator"); + parameters.parameter("central_meridian").setValue(-111.0); + parameters.parameter("latitude_of_origin").setValue(0.0); + parameters.parameter("scale_factor").setValue(0.9996); + parameters.parameter("false_easting").setValue(500000.0); + parameters.parameter("false_northing").setValue(0.0); + //parameters.parameter("semi_major").setValue(((GeodeticDatum)geoCRS.g= etDatum()).getEllipsoid().getSemiMajorAxis()); + //parameters.parameter("semi_minor").setValue(((GeodeticDatum)geoCRS.g= etDatum()).getEllipsoid().getSemiMinorAxis()); + + //MathTransform trans =3D mtFactory.createParameterizedTransform(param= eters); + //ProjectedCRS projCRS =3D crsFactory.createProjectedCRS( + // Collections.singletonMap("name", "WGS 84 / UTM Zone 12N"),=20 + // new org.geotools.referencing.operation.OperationMethod(trans), + // geoCRS, trans, cartCS); + =09 + // factories in the group will be created from defaults + + Map properties =3D Collections.singletonMap("name", "WGS 84 / UTM Zone= 12N"); + ProjectedCRS projCRS =3D factories.createProjectedCRS(properties, geoC= RS, null, parameters, + cartCS); + =20 + System.out.println(" Projected CRS: " + projCRS.toWKT()); + System.out.println("------------------------------------------");=20 + =09 + } +=09 + /** + * Creating a custom geographic coordinate system by hand without using= =20 + * any of the GT2 APIs (except FactoryFinder to get things started).=20 + * The following example creates a CRS to represent the Airy 1830=20 + * ellipsoid with the incoming data in the order of (long,lat,height) + * @throws FactoryException + */ + void createCRSByHand2() throws FactoryException { + //CoordinateOperationFactory transformFactory =3D FactoryFinder.getCoo= rdinateOperationFactory(); + DatumFactory datumFactory =3D FactoryFinder.getDatum= Factory(null); + CSFactory csFactory =3D FactoryFinder.getCSFac= tory(null); + =09 + Map map =3D new HashMap(); + map.put("name", "WGS84 Ellispoidal height"); + VerticalDatum ellipsoidVertical =3D + datumFactory.createVerticalDatum(map, VerticalDatumType.ELLIPSOIDAL); + =09 + map.clear(); + map.put("name", "Greenwich Meridian"); + PrimeMeridian greenwichMeridian =3D + datumFactory.createPrimeMeridian(map, 0, NonSI.DEGREE_ANGLE); + =09 + map.clear(); + map.put("name", "WGS 84 Ellipsoid Datum"); + Ellipsoid wgs84Ellipsoid =3D=20 + datumFactory.createFlattenedSphere(map, 6378137, 298.257223563, SI.ME= TER); + =09 + map.clear(); + map.put("name", "WGS84 Height Datum"); + GeodeticDatum wgs84EllipsoidHD =3D=20 + datumFactory.createGeodeticDatum(map, wgs84Ellipsoid, greenwichMeridi= an); + =09 + // Create a collection of axes for each of the coordinate systems. + map.clear(); + map.put("name", "Cartesian X axis"); + CoordinateSystemAxis xAxis =3D + csFactory.createCoordinateSystemAxis(map, "X", AxisDirection.GEOCENTR= IC_X, SI.METER); + =09 + map.clear(); + map.put("name", "Cartesian Y axis"); + CoordinateSystemAxis yAxis =3D + csFactory.createCoordinateSystemAxis(map, "Y", AxisDirection.GEOCENTR= IC_Y, SI.METER); + =09 + map.clear(); + map.put("name", "Cartesian Z axis"); + CoordinateSystemAxis zAxis =3D + csFactory.createCoordinateSystemAxis(map, "Z", AxisDirection.GEOCENTR= IC_Z, SI.METER); + =09 + map.clear(); + map.put("name", "Geodetic North axis"); + CoordinateSystemAxis northAxis =3D csFactory.createCoordinateSystemAxi= s(map, "N",AxisDirection.NORTH, NonSI.DEGREE_ANGLE); + =09 + map.clear(); + map.put("name", "Geodetic East axis"); + CoordinateSystemAxis eastAxis =3D csFactory.createCoordinateSystemAxis= (map, "E", AxisDirection.EAST, NonSI.DEGREE_ANGLE); + =09 + map.clear(); + map.put("name", "Geodetic Height axis"); + CoordinateSystemAxis heightAxis =3D csFactory.createCoordinateSystemAx= is(map, "Up", AxisDirection.UP, SI.METER); + =09 + // Now, the coordinate reference system that we'd use for output - = eg to a 3D renderer + map.clear(); + map.put("name", "Rendered Cartesian CS"); + + CartesianCS worldCS =3D csFactory.createCartesianCS(map, xAxis, yAxis,= zAxis); + =09 + map.clear(); + map.put("name", "Output Cartesian CS"); + =09 + geocentricCRS =3D crsFactory.createGeocentricCRS(map, wgs84EllipsoidHD= , worldCS); + System.out.println("Geocentric CRS: " + geocentricCRS.toWKT()); + =09 + // Now set up the CRS representing the Airy 1830 ellipsoid + map.clear(); + map.put("name", "Airy 1830"); + Ellipsoid airyEllipse =3D=20 + datumFactory.createFlattenedSphere(map, 6377563.396, 299.3249646, SI.= METER); + =09 + map.clear(); + map.put("name", "<long>,<lat> Airy 1830 geodetic"); + EllipsoidalCS airyCS =3D csFactory.createEllipsoidalCS(map, eastAxis, = northAxis, heightAxis); +=09 + airyCRS =3D crsFactory.createGeographicCRS(map, wgs84EllipsoidHD, airy= CS); +//TODO crs.toWKT() throws exceptions here (.toString() works) + System.out.println("Geographic CRS: " + airyCRS.toString()); + +// Finally, create the projection from the Airy datum to the WGS84 el= lipsoid CRS. + //CoordinateOperation cst =3D transformFactory.createOperation(airyCR= S, outputCRS); + //MathTransform mt =3D cst.getMathTrahsnform(); + +// now go convert those points + + + } +=09 + /*void createCRSfromEPSG () { + sourceCRS =3D CRS.decode("EPSG:4978"); //WGS84 geocentrique + targetCRS =3D CRS.decode("EPSG:4979"); //WGS84 geographique 3D + + + MathTransform math =3DCRS.transform( sourceCRS, targetCRS ); + DirectPosition pt1 =3D new GeneralDirectPosition(new Double(x),new= Double(y) ,new Double(z) ); =20 + math.transform( pt1, null ); + }*/ +=09 +=09 + /** + * A low level "operation", essentially just an equation (with some par= ameters) + * used to transform input to output points. + * @throws TransformException + * @throws MismatchedDimensionException + */ + void createAndUseMathTransform() throws FactoryException, MismatchedDim= ensionException, TransformException { + System.out.println("------------------------------------------");=20 + System.out.println("Creating a math transform by hand:"); + =09 + ParameterValueGroup params =3D mtFactory.getDefaultParameters("Hotine_= Oblique_Mercator"); + params.parameter("semi_major").setValue(6377298.556); + params.parameter("semi_minor").setValue(6356097.5503009); + params.parameter("longitude_of_center").setValue(115.0); + params.parameter("latitude_of_center").setValue(4.0); + params.parameter("azimuth").setValue(53.315820472222200); + params.parameter("rectified_grid_angle").setValue(53.130102361111100); + params.parameter("scale_factor").setValue(0.99984); + params.parameter("false_easting").setValue(0.0); + params.parameter("false_northing").setValue(0.0); + MathTransform trans =3D mtFactory.createParameterizedTransform(params)= ; + System.out.println("Math Transform: " + trans.toWKT()); + =09 + //transform some points + DirectPosition pt =3D new GeneralDirectPosition(120.0,6.0); =20 + System.out.println("Input point: " + pt); + pt =3D trans.transform(pt, null);=20 + System.out.println("Output point: " + pt); + System.out.println("Inverse of output point: " + trans.i= nverse().transform(pt,null)); + System.out.println("------------------------------------------");=20 + } +=09 + void createMathTransformBetweenCRSs() { + CoordinateOperationFactory coFactory =3D FactoryFinder.getCoordinateOp= erationFactory(null); + + //CoordinateReferenceSystem sourceCRS =3D ... + //CoordinateReferenceSystem targetCRS =3D ... + + //CoordinateOperation op =3D coFactory.createOperation(sourceCRS, targ= etCRS); + //MathTransform trans =3D op.getMathTransform(); + =09 + } +=09 + void identifiedObject() { + //I have a "scratch" class that does this somewhere... + =09 + } + =20 + /** + * Print out information about the identified object + */ + /* void printIdentifierStuff(IdentifiedObject identObj) { + System.out.println (" getName(): code, authority: " + identObj.= getName().getCode() + ", " + identObj.getName().getAuthority()); + =20 + GenericName[] aliases =3D identObj.getAlias(); + if (aliases.length =3D=3D 0) { + System.out.println(" no aliases"); + } else { + for (int i=3D0; i<aliases.length; i++) { + System.out.println(" Alias (" + i + "): " + aliases[i= ]); + } + } + =20 + Identifier[] idents =3D identObj.getIdentifiers(); + if (idents.length =3D=3D 0) { + System.out.println(" no extra identifiers"); + } else { + for (int i=3D0; i<idents.length; i++) { + System.out.println(" Extra Identifier (" + i + "): c= ode, authority: " + idents[i].getCode() + ", " + idents[i].getAuthority()= ); + } + } + }*/ + + public static void main(String[] args) { + new CTSTutorial(); + } +} Property changes on: geotools/trunk/gt/demo/referencing/src/org/geotools/= demo/referencing/CTSTutorial.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Id Name: svn:eol-style + native Copied: geotools/trunk/gt/demo/referencing/src/org/geotools/demo/referenc= ing/TransformData.java (from rev 14363, geotools/trunk/gt/module/migrate/= demo/referencing/src/org/geotools/demo/referencing/TransformData.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/module/migrate/demo/referencing/src/org/geotools/de= mo/referencing/TransformData.java 2005-06-14 04:36:52 UTC (rev 14363) +++ geotools/trunk/gt/demo/referencing/src/org/geotools/demo/referencing/= TransformData.java 2005-06-17 04:10:56 UTC (rev 14558) @@ -0,0 +1,164 @@ +/* + * Geotools2 - OpenSource mapping toolkit + * http://www.geotools.org + * (C) 2004,2005, Geotools Project Managment Committee (PMC) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + */ + +package org.geotools.demo.referencing; + +//java dependancies +import java.io.File; +import java.net.URL; +import java.util.Iterator; + +//geotools dedendancies +import org.geotools.data.DataStore; +import org.geotools.data.FeatureSource; +import org.geotools.feature.FeatureCollection; +import org.geotools.data.FeatureWriter; +import org.geotools.data.Transaction; +import org.geotools.data.shapefile.ShapefileDataStore; +import org.geotools.feature.Feature; +import org.geotools.feature.FeatureType; +import org.geotools.referencing.FactoryFinder; + +//geoapi dependancies +import org.opengis.referencing.crs.CRSFactory; +import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.referencing.operation.CoordinateOperationFactory; +import org.opengis.referencing.operation.CoordinateOperation; + +// JTS dependanceis +import com.vividsolutions.jts.geom.CoordinateFilter; +import com.vividsolutions.jts.geom.Geometry; + +/** + * A simple demo to transform the geometries in a shapefile from the sou= rce + * coordinate reference system (CRS) to a target CRS. Source and target + * CRS's are given here as well know text (WKT) strings. The default out= put path + * is the users home directory. + * + * The following method is rather low-level. Typically the higher-level + * DefaultQuery method demoed in org.geotools.demo.data.ShapeReprojector= would + * be used instead. + * + * @version $Id:$ + * @author rschulz + */ +public class TransformData { + =20 + //hardcoded WKT strings + private static String SOURCE_WKT =3D "GEOGCS[\"WGS84\", DATUM[\"WGS8= 4\", SPHEROID[\"WGS84\", 6378137.0, 298.257223563]], PRIMEM[\"Greenwich\"= , 0.0], UNIT[\"degree\",0.017453292519943295], AXIS[\"Longitude\",EAST], = AXIS[\"Latitude\",NORTH]]"; + private static String TARGET_WKT =3D "PROJCS[\"UTM Zone 14N\", GEOGC= S[\"WGS84\", DATUM[\"WGS84\", SPHEROID[\"WGS84\", 6378137.0, 298.25722356= 3]], PRIMEM[\"Greenwich\", 0.0], UNIT[\"degree\",0.017453292519943295], A= XIS[\"Longitude\",EAST], AXIS[\"Latitude\",NORTH]], PROJECTION[\"Transver= se_Mercator\"], PARAMETER[\"central_meridian\", -99.0], PARAMETER[\"latit= ude_of_origin\", 0.0], PARAMETER[\"scale_factor\", 0.9996], PARAMETER[\"f= alse_easting\", 500000.0], PARAMETER[\"false_northing\", 0.0], UNIT[\"met= re\",1.0], AXIS[\"x\",EAST], AXIS[\"y\",NORTH]]"; + //private static String TARGET_WKT =3D "PROJCS[\"Lambert\", GEOGCS[\= "WGS84\", DATUM[\"WGS84\", SPHEROID[\"WGS84\", 6378137.0, 298.257223563]]= , PRIMEM[\"Greenwich\", 0.0], UNIT[\"degree\",0.017453292519943295], AXIS= [\"Longitude\",EAST], AXIS[\"Latitude\",NORTH]], PROJECTION[\"Lambert_Con= formal_Conic_2SP\"], PARAMETER[\"semi_major\", 6378137.0], PARAMETER[\"se= mi_minor\", 6356752.314245179], PARAMETER[\"central_meridian\", 0.0], PAR= AMETER[\"standard_parallel_1\", 20.0], PARAMETER[\"standard_parallel_2\",= 20.0], PARAMETER[\"latitude_of_origin\", 0.0], PARAMETER[\"false_easting= \", 100000.0], PARAMETER[\"false_northing\", 0.0], UNIT[\"metre\",1.0], A= XIS[\"x\",EAST], AXIS[\"y\",NORTH]]"; + + //private static String WKT_2 =3D "PROJCS[\"Mercator\", GEOGCS[\"WGS= 84\", DATUM[\"WGS84\", SPHEROID[\"WGS84\", 6378137.0, 298.257223563]], PR= IMEM[\"Greenwich\", 0.0], UNIT[\"degree\",0.017453292519943295], AXIS[\"L= ongitude\",EAST], AXIS[\"Latitude\",NORTH]], PROJECTION[\"Mercator_2SP\"]= , PARAMETER[\"semi_major\", 6378137.0], PARAMETER[\"semi_minor\", 6356752= .314245179], PARAMETER[\"central_meridian\", 0.0], PARAMETER[\"standard_p= arallel_1\", 20.0], PARAMETER[\"false_easting\", 0.0], PARAMETER[\"false_= northing\", 1000000.0], UNIT[\"metre\",1.0], AXIS[\"x\",EAST], AXIS[\"y\"= ,NORTH]]"; + //private static String WKT_3 =3D "GEOGCS[\"Sphere\", DATUM[\"WGS84\= ", SPHEROID[\"WGS84\", 6370997.0, 0],TOWGS84[0,0,0,0,0,0,0]], PRIMEM[\"Gr= eenwich\", 0.0], UNIT[\"degree\",0.017453292519943295], AXIS[\"Longitude\= ",EAST], AXIS[\"Latitude\",NORTH]]"; + //private static String WKT_4 =3D "PROJCS[\"TransverseMercator\", GE= OGCS[\"Sphere\", DATUM[\"Sphere\", SPHEROID[\"Sphere\", 6370997.0, 0],TOW= GS84[0,0,0,0,0,0,0]],PRIMEM[\"Greenwich\", 0.0], UNIT[\"degree\",0.017453= 292519943295], AXIS[\"Longitude\",EAST], AXIS[\"Latitude\",NORTH]], PROJE= CTION[\"Transverse_Mercator\"], PARAMETER[\"semi_major\", 6370997], PARAM= ETER[\"semi_minor\", 6370997], PARAMETER[\"central_meridian\", 0.0], PARA= METER[\"latitude_of_origin\", 0.0], PARAMETER[\"scale_factor\", 1.0], PAR= AMETER[\"false_easting\", 0.0], PARAMETER[\"false_northing\", 0.0], UNIT[= \"metre\",1.0], AXIS[\"x\",EAST], AXIS[\"y\",NORTH]]"; + + /** Factory to create coordinate reference systems from WKT strings*= / + private CRSFactory crsFactory =3D FactoryFinder.getCRSFactory(null); + =20 + /** Factory to create transformations from a source and target CS */ + private CoordinateOperationFactory coFactory =3D FactoryFinder.getCo= ordinateOperationFactory(null); + =20 + /** Creates a new instance of TransformData */ + public TransformData(URL inURL, URL outURL, String inWKT, String out= WKT) { + FeatureCollection fc =3D null; + Iterator i =3D null; + FeatureWriter outFeatureWriter =3D null; + try { + //create the CS's and transformation + CoordinateReferenceSystem inCRS =3D crsFactory.createFromWKT= (inWKT); + CoordinateReferenceSystem outCRS =3D crsFactory.createFromWK= T(outWKT); + System.out.println("source CRS: " + inCRS.getName().getCode(= )); + System.out.println("target CRS: " + outCRS.getName().getCode= ()); + CoordinateOperation co =3D coFactory.createOperation(inCRS, = outCRS); + System.out.println("transform: " + co.getMathTransform().toW= KT()); + CoordinateFilter transFilter =3D new TransformationCoordinat= eFilter(co.getMathTransform()); + =20 + //get the input shapefile + DataStore inStore =3D new ShapefileDataStore(inURL); + String name =3D inStore.getTypeNames()[0]; + FeatureSource inSource =3D inStore.getFeatureSource(name); + fc =3D inSource.getFeatures(); + FeatureType inSchema =3D inSource.getSchema(); + + //create the output shapefile + DataStore outStore =3D new ShapefileDataStore(outURL); + Object[] outAttributes =3D new Object[inSchema.getAttributeC= ount()]; + outStore.createSchema(inSchema); + outFeatureWriter =3D outStore.getFeatureWriter(outStore.getT= ypeNames()[0], Transaction.AUTO_COMMIT); + =20 + for( i=3Dfc.iterator(); i.hasNext();){ + Feature inFeature =3D (Feature)i.next(); + // create a new feature + Feature outFeature =3D outFeatureWriter.next(); + for (int j =3D 0; j < inFeature.getNumberOfAttributes();= j++) { + Object inAttribute =3D inFeature.getAttribute(j); + if (inAttribute instanceof Geometry) { + Geometry geom =3D (Geometry) inAttribute; + geom.apply(transFilter); + outFeature.setAttribute(j, geom); + } else { + outFeature.setAttribute(j, inAttribute); + } + } + // write the new feature + outFeatureWriter.write(); + } + =20 + //close stuff + fc.close(i); + outFeatureWriter.close(); + System.out.println("Done"); + } catch (Exception e) { + System.out.println("Exception: " + e); + e.printStackTrace(); + } + } + =20 + /** + * Command line arguments are: + * <ul> + * <li>in file - input shapefile + * <li>out file - output shapefile + * <li>in WKT - WKT string for the source coordinate system + * <li>out WKT - WKT string for the target coordinate system + * </ul> + * + * @param args the command line arguments + *=20 + */ + public static void main(String[] args) throws Exception { + URL inURL, outURL; + =20 + if (args.length =3D=3D 0) { + inURL =3D TransformData.class.getClassLoader().getResource("= org/geotools/sampleData/statepop.shp"); + outURL =3D new File(System.getProperty("user.home") + "/stat= epopTransform.shp").toURL(); + new TransformData(inURL, outURL, SOURCE_WKT, TARGET_WKT); + } else if (args.length =3D=3D 2) { + inURL =3D new File(args[0]).toURL(); + outURL =3D new File(args[1]).toURL(); + new TransformData(inURL, outURL, SOURCE_WKT, TARGET_WKT); + } else if (args.length =3D=3D 4) { + inURL =3D new File(args[0]).toURL(); + outURL =3D new File(args[1]).toURL(); + new TransformData(inURL, outURL, args[2], args[4]); + } else { + System.out.println("Usage: java TransformData <in file> <out= file> <in WKT> <out WKT>"); + } + } + =20 +} Copied: geotools/trunk/gt/demo/referencing/src/org/geotools/demo/referenc= ing/TransformationConsole.java (from rev 14363, geotools/trunk/gt/module/= migrate/demo/referencing/src/org/geotools/demo/referencing/Transformation= Console.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/module/migrate/demo/referencing/src/org/geotools/de= mo/referencing/TransformationConsole.java 2005-06-14 04:36:52 UTC (rev 14= 363) +++ geotools/trunk/gt/demo/referencing/src/org/geotools/demo/referencing/= TransformationConsole.java 2005-06-17 04:10:56 UTC (rev 14558) @@ -0,0 +1,201 @@ +/* + * Geotools2 - OpenSource mapping toolkit + * (C) 2005, Geotools Project Managment Committee (PMC) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + */ +package org.geotools.demo.referencing; + +// J2SE and JAI dependencies +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Collections; +import java.util.Map; + +// geoapi interfaces +import org.opengis.parameter.ParameterValueGroup; +import org.opengis.referencing.crs.CRSFactory; +import org.opengis.referencing.crs.GeographicCRS; +import org.opengis.referencing.crs.ProjectedCRS; +import org.opengis.referencing.cs.CSFactory; +import org.opengis.referencing.cs.EllipsoidalCS; +import org.opengis.referencing.cs.CartesianCS; +import org.opengis.referencing.cs.CoordinateSystemAxis; +import org.opengis.referencing.datum.GeodeticDatum; +import org.opengis.referencing.operation.MathTransformFactory; +import org.opengis.referencing.operation.MathTransform; +import org.opengis.referencing.operation.CoordinateOperationFactory; +import org.opengis.referencing.operation.CoordinateOperation; +import org.opengis.referencing.FactoryException; +import org.opengis.referencing.operation.TransformException; +import org.opengis.spatialschema.geometry.DirectPosition; + +// geotools dependancies +import org.geotools.referencing.FactoryFinder; +import org.geotools.referencing.factory.FactoryGroup; +import org.geotools.geometry.GeneralDirectPosition; + + +/** + * An example of application reading points from the standard input, tr= ansforming + * them and writting the result to the standard output. This class can b= e run from + * the command-line using the following syntax: + * + * <blockquote><pre> + * java TransformationConsole [classification] + * </pre></blockquote> + * + * Where [classification] is the the classification name of the projecti= on to perform. + * The default value is "Mercator_1SP". The list of supported classifica= tion name is + * available here: + * + * http://docs.codehaus.org/display/GEOTOOLS/Coordinate+Transformation= +Parameters + * + * To exit from the application, enter "exit". + * + * @version $Id: TransformationConsole.java,v 1.1 2004/02/05 16:04:15 de= sruisseaux Exp $ + * @author Martin Desruisseaux + */ +public class TransformationConsole { + /** + * The program main entry point. + * + * @param args Array of command-line arguments. This small demo acc= ept only + * one argument: the classification name of the project= ion to + * perform. + * + * @throws IOException if an error occured while reading the input s= tream. + * @throws FactoryException if a coordinate system can't be construc= ted. + * @throws TransformException if a transform failed. + */ + public static void main(String[] args) throws IOException, FactoryEx= ception, TransformException { + /* + * Check command-line arguments. + */ + String classification; + switch (args.length) { + case 0: classification =3D "Mercator_1SP"; break; + case 1: classification =3D args[0]; break; + default: System.err.println("Expected 0 or 1 argument"); ret= urn; + } + /* + * The factories to use for constructing coordinate systems.=20 + */ + CRSFactory crsFactory =3D FactoryFinder.getCRSFactory(null); + CSFactory csFactory =3D FactoryFinder.getCSFactory(null); + MathTransformFactory mtFactory =3D FactoryFinder.getMathTransfor= mFactory(null); + FactoryGroup factories =3D new FactoryGroup(); + /* + * Construct the source CoordinateReferenceSystem. We will use a= geographic coordinate + * system, i.e. one that use (latitude,longitude) coordinates. = Latitude values + * are increasing north and longitude values area increasing eas= t. Angular units + * are degrees and prime meridian is Greenwich. Datum is WGS 84= (a commonly + * used one for remote sensing data and GPS). Note that the= Geotools library + * provides simpler ways to construct geographic coordinate syst= ems using default + * values for some arguments. But we show here the complete way= in order to show + * the range of possibilities and to stay closer to the OpenGIS'= s specification. + */ + CoordinateSystemAxis longAxis =3D org.geotools.referencing.cs.De= faultCoordinateSystemAxis.GEODETIC_LONGITUDE; + CoordinateSystemAxis latAxis =3D org.geotools.referencing.cs.Def= aultCoordinateSystemAxis.GEODETIC_LATITUDE; + EllipsoidalCS ellipseCS =3D csFactory.createEllipsoidalCS(Collec= tions.singletonMap("name", "Lat/Long"),=20 + latAxis,longAxis); + GeodeticDatum datum =3D org.geotools.referencing.datum.DefaultGe= odeticDatum.WGS84; + GeographicCRS sourceCRS =3D crsFactory.createGeographicCRS(Colle= ctions.singletonMap("name", "WGS 84"),=20 + datum, ellipseCS); + /* + * Construct the target CoordinateReferenceSystem. We will use a= projected coordinate + * system, i.e. one that use linear (in metres) coordinates. We = will use the + * same ellipsoid than the source geographic coordinate system (= i.e. WGS84). + * Default parameters will be used for this projection, but fals= e_easting and=20 + * false_northing values could be set below. + * + * Note: The 'sourceCRS' argument below is the geographic coordi= nate system + * to base projection on. It is also the source coordinate= system in + * this particular case, but this may not alway be the cas= e. + */ + ParameterValueGroup parameters =3D mtFactory.getDefaultParameter= s(classification); + if (false) { + // Set optional parameters here. This example set the false + // easting and northing just for demonstration purpose. + parameters.parameter("false_easting").setValue(1000.0); + parameters.parameter("false_northing").setValue(1000.0); + =20 + } + CartesianCS cartCS =3D org.geotools.referencing.cs.DefaultCartes= ianCS.GENERIC_2D; + Map properties =3D Collections.singletonMap("name", classificati= on); + ProjectedCRS targetCRS =3D factories.createProjectedCRS(properties, sou= rceCRS, null, parameters, + cartCS); + =20 + /* + * Now, we have built source and destination coordinate referenc= systems ('sourceCRS' + * and 'targetCRS'). Here are some observations about their rela= tionships: + * + * * We use the same ellipsoid (WGS 84) for both, but it coul= d as well be + * different. Using different ellipsoids would require a dat= um shift to=20 + * transform between the two datums. + * + * * The axis order is inverted between the source (latitude,l= ongitude) + * and the target (x,y). This is up to the user to choose= the axis + * order he want; Geotools should correctly swap them as nee= ded. User + * could as well reverse axis orientation (e.g. make longitu= de values + * increasing West); Geotools should handle that correctly. + * + * Now, get the transformation. + */ + CoordinateOperationFactory coFactory =3D FactoryFinder.getCoordinateOpe= rationFactory(null);=09 + CoordinateOperation co =3D coFactory.createOperation(sourceCRS, = targetCRS); + + /* + * The CoordinateOperation object contains information about + * the transformation. It does not actually perform the transfor= m + * operations on points. In order to transform points, we must g= et + * the math transform. + * + * Because source and target coordinate reference systems are bo= th two-dimensional, + * this transform object will actually be an instance of MathTra= nsform2D. + * The MathTransform2D interface is a Geotools's extension that = is not part + * of the OpenGIS's specification. This class provides additiona= l methods + * for interoperability with Java2D. If the user want to use it,= he have to + * cast the transform to MathTransform2D. + */ + MathTransform transform =3D co.getMathTransform(); + /* + * Now, read lines from the standard input, transform them, + * and write the result to the standard output. Note: Java + * is not very good for console application. See many bug + * reports (e.g. http://developer.java.sun.com/developer/bugPara= de/bugs/4071281.html). + */ + System.out.print("Projection classification is "); + System.out.println(classification); + System.out.println("Source CRS is:"); + System.out.println(" " + sourceCRS.toWKT()); + System.out.println("Target CRS is:"); + System.out.println(" " + targetCRS.toWKT()); + System.out.println("Enter (latitude longitude) coordinates separ= ated by a space."); + System.out.println("Enter \"exit\" to finish."); + final BufferedReader in =3D new BufferedReader(new InputStreamRe= ader(System.in)); + String line; while ((line=3Din.readLine()) !=3D null) { + line =3D line.trim(); + if (line.equalsIgnoreCase("exit")) { + break; + } + int split =3D line.indexOf(' '); + if (split >=3D 0) { + double latitude =3D Double.parseDouble(line.substring(0= , split)); + double longitude =3D Double.parseDouble(line.substring( = split)); + DirectPosition point =3D new GeneralDirectPosition(latit= ude,longitude); + point =3D transform.transform(point, point); + System.out.println(point); + } + } + } +} Copied: geotools/trunk/gt/demo/referencing/src/org/geotools/demo/referenc= ing/TransformationCoordinateFilter.java (from rev 14363, geotools/trunk/g= t/module/migrate/demo/referencing/src/org/geotools/demo/referencing/Trans= formationCoordinateFilter.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/module/migrate/demo/referencing/src/org/geotools/de= mo/referencing/TransformationCoordinateFilter.java 2005-06-14 04:36:52 UT= C (rev 14363) +++ geotools/trunk/gt/demo/referencing/src/org/geotools/demo/referencing/= TransformationCoordinateFilter.java 2005-06-17 04:10:56 UTC (rev 14558) @@ -0,0 +1,58 @@ +/* + * Geotools2 - OpenSource mapping toolkit + * http://www.geotools.org + * (C) 2004, 2005 Geotools Project Managment Committee (PMC) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + */ + +package org.geotools.demo.referencing; + +import org.opengis.referencing.operation.MathTransform; +import org.opengis.spatialschema.geometry.DirectPosition; +import org.geotools.geometry.GeneralDirectPosition; +import com.vividsolutions.jts.geom.CoordinateFilter; + +/** + * A coordinate filter that can be used to tranform each coordinate=20 + * in a geometry. This is applied to each individual coordinate, + * so it does not work well when the polygon crosses 180 + central lat=20 + * or 90 + lat of origin. There are also some problems with projections = that + * have issues with 90 lat.=20 + * + * @version $Id: + * @author rschulz + */ +public class TransformationCoordinateFilter implements CoordinateFilter{ + /* Transform to apply to each coordinate*/ + private MathTransform transform; + =20 + /** Creates a new instance of TransformationCoordinateFilter */ + public TransformationCoordinateFilter(MathTransform transform) { + this.transform =3D transform; + } + =20 + /*performs a transformation on a coordinate*/ + public void filter(com.vividsolutions.jts.geom.Coordinate coordinate= ) { + DirectPosition point =3D new GeneralDirectPosition(coordinate.x,= coordinate.y); + try { + point =3D transform.transform(point, point); + } + catch (org.opengis.referencing.operation.TransformException e) { + System.out.println("Error in transformation: " + e); + } + =20 + coordinate.x =3D point.getOrdinate(0); + coordinate.y =3D point.getOrdinate(1); + } + =20 +} |