开源社区里利用JTS库进行空间处理的代码参考

开源社区里对于JTS库的使用还是比较广泛的。 下面是一段引自网上的代码工具类,可以帮助大家理解JTS的各个功能操作。http://rsiaf.googlecode.com/svn/rs-gis-core/trunk/src/main/java/com/revolsys/gis/jts/JtsGeometryUtil.java   package com.revolsys.gis
摘要由CSDN通过智能技术生成

开源社区里对于JTS库的使用还是比较广泛的。 下面是一段引自网上的代码工具类,可以帮助大家理解JTS的各个功能操作。

http://rsiaf.googlecode.com/svn/rs-gis-core/trunk/src/main/java/com/revolsys/gis/jts/JtsGeometryUtil.java

 

 

 

package com.revolsys.gis.jts;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import com.revolsys.gis.data.model.DataObject;
import com.vividsolutions.jts.algorithm.Angle;
import com.vividsolutions.jts.algorithm.CGAlgorithms;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.CoordinateSequence;
import com.vividsolutions.jts.geom.CoordinateSequenceFactory;
import com.vividsolutions.jts.geom.CoordinateSequenceFilter;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryCollection;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LineSegment;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.LinearRing;
import com.vividsolutions.jts.geom.MultiLineString;
import com.vividsolutions.jts.geom.MultiPoint;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.Polygon;
import com.vividsolutions.jts.geom.PrecisionModel;
import com.vividsolutions.jts.geom.impl.CoordinateArraySequenceFactory;
import com.vividsolutions.jts.geom.impl.PackedCoordinateSequenceFactory;
import com.vividsolutions.jts.operation.linemerge.LineMerger;

public final class JtsGeometryUtil {
  public static final String FEATURE_PROPERTY = "feature";

  private JtsGeometryUtil() {
  }

  public static DataObject getGeometryFeature(final Geometry geometry) {
    return (DataObject)getGeometryProperty(geometry, FEATURE_PROPERTY);
  }

  public static void setGeometryFeature(final Geometry geometry,
    final DataObject feature) {
    setGeometryProperty(geometry, FEATURE_PROPERTY, feature);
  }

  @SuppressWarnings("unchecked")
  public static <T extends Object> T getGeometryProperty(
    final Geometry geometry, final String name) {
    Map<String, Object> map = getGeometryProperties(geometry);
    return (T)map.get(name);
  }

  @SuppressWarnings("unchecked")
  public static Map<String, Object> getGeometryProperties(
    final Geometry geometry) {
    Object userData = geometry.getUserData();
    if (userData instanceof Map) {
      Map<String, Object> map = (Map<String, Object>)userData;
      return map;
    }
    return Collections.emptyMap();
  }

  @SuppressWarnings("unchecked")
  public static void setGeometryProperty(final Geometry geometry,
    final String name, final Object value) {
    Object userData = geometry.getUserData();
    if (!(userData instanceof Map)) {
      userData = new TreeMap<Object, Object>();
      geometry.setUserData(userData);
    }
    Map<Object, Object> map = (Map<Object, Object>)userData;
    map.put(name, value);

  }

  public static Polygon createPolygon(final MultiLineString multiLine) {
    GeometryFactory factory = multiLine.getFactory();
    Coordinate[] coordinates = getMergeLine(multiLine).getCoordinates();
    LinearRing linearRing = factory.createLinearRing(coordinates);
    Polygon polygon = factory.createPolygon(linearRing, null);
    return polygon;

  }

  public static LineString getMergeLine(final MultiLineString multiLineString) {
    Collection<LineString> lineStrings = getMergedLines(multiLineString);
    int numLines = lineStrings.size();
    if (numLines == 1) {
      return (LineString)lineStrings.iterator().next();
    } else {
      return null;
    }
  }

  @SuppressWarnings("unchecked")
  public static Collection<LineString> getMergedLines(
    final MultiLineString multiLineString) {
    LineMerger merger = new LineMerger();
    merger.add(multiLineString);
    Collection<LineString> lineStrings = merger.getMergedLineStrings();
    return lineStrings;
  }

  /**
   * Merge two lines that share common coordinates at either the start or end.
   * If the lines touch only at their start coordinates, the line2 will be
   * reversed and joined before the start of line1. If the tow lines ouch only
   * at their end coordinates, the line2 will be reversed and joined after the
   * end of line1.
   * 
   * @param line1 The first line.
   * @param line2 The second line.
   * @return The new line string
   */
  public static LineString merge(final LineString line1, final LineString line2) {
    CoordinateSequence coordinates = merge(line1.getCoordinateSequence(),
      line2.getCoordinateSequence());
    GeometryFactory factory = line1.getFactory();
    LineString line = factory.createLineString(coordinates);
    line.setUserData(line1.getUserData());
    return line;
  }

  private static CoordinateSequence merge(final CoordinateSequence coordinates1,
    final CoordinateSequence coordinates2) {
    Coordinate[] coordinates = new Coordinate[coordinates1.size()
      + coordinates2.size() - 1];
    int numCoords = 0;
    Coordinate coordinates1Start = coordinates1.getCoordinate(0);
    Coordinate coordinates1End = coordinates1.getCoordinate(coordinates1.size() - 1);
    Coordinate coordinates2Start = coordinates2.getCoordinate(0);
    Coordinate coordinates2End = coordinates2.getCoordinate(coordinates2.size() - 1);
    if (coordinates1Start.equals(coordinates2End)) {
      numCoords = addCoordinates(coordinates2, coordinates, numCoords, null);
      numCoords = addCoordinates(coordinates1, coordinates, numCoords,
        coordinates[numCoords - 1]);
    } else if (coordinates2Start.equals(coordinates1End)) {
      numCoords = addCoordinates(coordinates1, coordinates, numCoords, null);
      numCoords = addCoordinates(coordinates2, coordinates, numCoords,
        coordinates[numCoords - 1]);
    } else if (coordinates1Start.equals(coordinates2Start)) {
      numCoords = addReversedCoordinates(coordinates2, coordinates, numCoords,
        null);
      numCoords = addCoordinates(coordinates1, coordinates, numCoords,
        coordinates[numCoords - 1]);
    } else if (coordinates1End.equals(coordinates2End)) {
      numCoords = addCoordinates(coordinates1, coordinates, numCoords, null);
      numCoords = addReversedCoordinates(coordinates2, coordinates, numCoords,
        coordinates[numCoords - 1]);
    } else {
      throw new IllegalArgumentException("lines don't touch");

    }

    if (numCoords != coordinates.length) {
      Coordinate[] newCoordinates = new Coordinate[numCoords];
      System.arraycopy(coordinates, 0, newCoordinates, 0, numCoords);
      coordinates = newCoordinates;
    }

    return CoordinateArraySequenceFactory.instance().create(coordinates);
  }

  public static int addCoordinates(final CoordinateSequence src, final Coordinate[] dest,
    final int startIndex, final Coordinate lastCoordinate) {
    Coordinate previousCoordinate = lastCoordinate;
    int coordIndex = startIndex;
    try {
      for (int i = 0; i < src.size(); i++) {
        Coordinate coordinate = src.getCoordinate(i);
        if (!coordinate.equals(previousCoordinate)) {
          dest[coordIndex++] = coordinate;
        }
        previousCoordinate = coordinate;
      }
    } catch (ArrayIndexOutOfBoundsException e) {
      e.printStackTrace();
    }
    return coordIndex;
  }

  public static int addReversedCoordinates(final CoordinateSequence src,
    final Coordinate[] dest, final int startIndex, final Coordinate lastCoordinate) {
    Coordinate endCoordinate = lastCoordinate;
    int coordIndex = startIndex;
    try {
      for (int i = src.size() - 1; i > -1; i--) {
        Coordinate coordinate = src.getCoordinate(i);
        if (!coordinate.equals(endCoordinate)) {
          dest[coordIndex++] = coordinate;
        }
        endCoordinate = coordinate;
      }
    } catch (ArrayIndexOutOfBoundsException e) {
      e.printStackTrace();
    }
    return coordIndex;
  }

  public static boolean equalsExact3D(final LineString line1, final  LineString line2) {
    if (line1.getNumPoints() != line2.getNumPoints()) {
      return false;
    }
    for (int i = 0; i < line1.getNumPoints(); i++) {
      line1.getCoordinateN(i);
      Coordinate coordinate1 = line1.getCoordinateN(i);
      Coordinate coordinate2 = line2.getCoordinateN(i);
      if (!coordinate1.equals3D(coordinate2)) {
        return false;
      }
    }
    return true;
  }

  public static boolean equalsExact3D(final Point point1, final Point point2) {
    Coordinate coordinate
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值