Package WKT_Generalize.testcode

Source Code of WKT_Generalize.testcode.Generalize

/*
*    GeoTools - The Open Source Java GIS Toolkit
*    http://geotools.org
*
*    (C) 2005-2008, Open Source Geospatial Foundation (OSGeo)
*
*    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 WKT_Generalize.testcode;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;

import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryCollection;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.LinearRing;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.Polygon;
import com.vividsolutions.jts.io.WKTReader;
import com.vividsolutions.jts.simplify.TopologyPreservingSimplifier;


public class Generalize
{
  public static Geometry simplify(Geometry g,double tolerance) throws Exception
  {
    g = TopologyPreservingSimplifier.simplify(g,tolerance);
    if (!(g instanceof GeometryCollection))
    {

      if (g instanceof LineString)
      {     
        LineString gg[] = new LineString[1];
        gg[0] = (LineString)g;
        g = g.getFactory().createMultiLineString( (LineString[]) gg );
      }
      if (g instanceof Polygon)
      {
        Polygon gg[] = new Polygon[1];
        gg[0] = (Polygon)g;
        g = g.getFactory().createMultiPolygon( (Polygon[]) gg );
      }
      if (g instanceof Point)
      {
        Point gg[] = new Point[1];
        gg[0] = (Point)g;
        g = g.getFactory().createMultiPoint( (Point[]) gg );
      }
    }
    GeometryCollection gc = (GeometryCollection) g;
    ArrayList subs = new ArrayList();
    for (int t=0;t<gc.getNumGeometries();t++)
    {
      //replace each sub component with a simpler version or null
      Geometry gsub = gc.getGeometryN(t);
      if (gsub instanceof Point)
      {
        subs.add( gsub ); //always keep
      }
      else if (gsub instanceof LineString)
      {
        if (gsub.getLength() > tolerance)
          subs.add( gsub );
      }
      else if (gsub instanceof Polygon)
      {
        Geometry p = handlePolygon( (Polygon) gsub, tolerance);
        if (p != null)
          subs.add( p );
      }
      else
        throw new Exception("cannot handle type -"+gsub.getGeometryType());
    }
   
      if (subs.size() ==0)
        return null;
      if (subs.size() ==1)
      {
        return (Geometry) subs.get(0);
      }
   
      return g.getFactory().buildGeometry(subs);
  }
 
  /**
   * @param gsub
   * @return
   */
  private static Polygon handlePolygon(Polygon p,double tol)
  {
    if  (p.getArea() < tol*tol)
      return null;
   
    //okay, kill any ring with area < tol*tol
   
    LinearRing lr =  (LinearRing) p.getExteriorRing();
    if (area(lr) <tol*tol)
      return null;
   
    //now, start with inner rings
    ArrayList holes = new ArrayList();
    for (int t=0;t<p.getNumInteriorRing();t++)
    {
      LinearRing lr_hole =  (LinearRing) p.getInteriorRingN(t);
      if (area(lr_hole) >tol*tol)
      {
        holes.add(lr_hole);
      }
    }
   
    return p.getFactory().createPolygon(lr,(LinearRing[])holes.toArray(new LinearRing[0])  );   
  }
 
  public static double area(LinearRing lr)
  {
    Polygon p = lr.getFactory().createPolygon(lr,null);
    return p.getArea();
  }

  public static void main(String[] args)
  {
    try{
      double TOLERANCE = 180.0/50000.0; // (smallest size)/(max image width)
    System.out.println("TOLERANCe = "+TOLERANCE);
      BufferedWriter writer = new BufferedWriter(new FileWriter(args[1]));
      String COLUMN = args[3];
      String TABLE = args[2];
          BufferedReader reader = new BufferedReader(new FileReader(args[0]));
          WKTReader wktreader = new WKTReader();
          reader.readLine();
          reader.readLine();
          boolean keep_going = true;
          while (keep_going)
          {
            String line = reader.readLine();
            if (line != null)
            {
              int indx = line.indexOf('|');
             
              if (indx !=-1)
              {
                String oid = line.substring(0,indx-1);
                String wkt = line.substring(indx+1);
               
                System.out.println("doing: "+oid + " (size="+line.length()+")");
               
                Geometry g = wktreader.read(wkt);
               
                //g = TopologyPreservingSimplifier.simplify(g,TOLERANCE);
                g= simplify(g,TOLERANCE);
               
                String wkt2;
               
                if (g==null)
                  wkt2 = "NULL";
                else
                {
                  wkt2 = g.toString();
                  wkt2 = "'"+wkt2+"'::geometry";
                }
               
               
                String sql = "update "+TABLE+" set "+COLUMN+"= "+wkt2+"  WHERE oid="+oid+";\n";
                //String sql = oid +" | "+ wkt2 +"\n";
                //sql  = sql.replaceAll(", ",",");
                //sql  = sql.replaceAll(" \\(\\(","((");
                writer.write(sql);
              //System.out.println("done: "+oid);
  //System.out.println("diff in length ("+oid+") = "+Math.abs(sql.length() - line.length()));    
              }
            }
            else
            {
              keep_going = false;
            }
          }
          writer.flush();
          writer.close();
          System.out.println("DONE!");
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
       
  }
}
TOP

Related Classes of WKT_Generalize.testcode.Generalize

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.