Juicio de relación
- La relación entre geometría es la siguiente:
Igual a: |
Las formas geométricas son topológicamente iguales. |
Disjunto: |
La geometría no tiene puntos en común. |
Interseca: |
Las formas geométricas tienen al menos un punto común (diferente de disjunto) |
Toques: |
La geometría tiene al menos un punto límite común, pero no tiene puntos internos. |
Cruces: |
Las formas geométricas comparten algunos pero no todos los puntos internos. |
Con (Dentro): |
Las líneas de geometría A están todas dentro de la geometría B. |
Contiene: |
Las líneas de geometría B están todas dentro de la geometría A (diferente de la inclusión) |
Superposiciones: |
Las formas geométricas comparten algunos pero no todos los puntos comunes, y tienen su propia área en la intersección. |
- El siguiente ejemplo muestra cómo usar las operaciones Equals, Disjoint, Intersects, Within:
paquete com.alibaba.autonavi; import com.vividsolutions.jts.geom. *; import com.vividsolutions.jts.io.ParseException; import com.vividsolutions.jts.io.WKTReader; / ** * gemotry 之间 的 关系 * @author xingxing.dxx * * / public class GeometryRelated { private GeometryFactory geometryFactory = new GeometryFactory (); / ** * 两个 几何 对象 是否 是 重叠 的 * @return * @throws ParseException * / public boolean equalsGeo () lanza ParseException { WKTReader reader = new WKTReader (geometryFactory); LineString geometry1 = (LineString) reader.read ("LINESTRING (0 0, 2 0, 5 0)"); LineString geometry2 = (LineString) reader.read ("LINESTRING (5 0, 0 0)"); return geometry1.equals (geometry2); // true } / ** * 几何 对象 没有 交点 (相邻) * @return * @throws ParseException * / public boolean disjointGeo () lanza ParseException { WKTReader reader = new WKTReader (geometryFactory); LineString geometry1 = (LineString) reader.read ("LINESTRING (0 0, 2 0, 5 0)"); LineString geometry2 = (LineString) reader.read ("LINESTRING (0 1, 0 2)"); return geometry1.disjoint (geometry2); } / ** * 至少 一个 公共 点 (相交) * @return * / public boolean intersectsGeo () lanza ParseException { WKTReader reader = nuevo WKTReader (geometryFactory); LineString geometry1 = (LineString) reader.read ("LINESTRING (0 0, 2 0, 5 0)"); LineString geometry2 = (LineString) reader.read ("LINESTRING (0 0, 0 2)"); Geometry interPoint = geometry1.intersection (geometry2); // 相交 点 System.out.println (interPoint.toText ()); // 输出 POINT (0 0) return geometry1.intersects (geometry2); } / ** * 判断 以 x, y 为 坐标 的 点 punto (x, y) 是否 在 geometría 表示 的 Polígono 中 * @param x * @param y * @param geometry wkt 格式 * @return * / public boolean dentro de Geo (doble x, doble y, geometría de cadena) arroja ParseException { Coordinate coord = new Coordinate (x, y); Punto punto = geometryFactory.createPoint (coord); WKTReader reader = nuevo WKTReader (geometryFactory); Polígono polígono = (Polígono) reader.read (geometría); punto de retorno dentro de (polígono); } / ** * @param args * @throws ParseException * / public static void main (String [] args) lanza ParseException { GeometryRelated gr = new GeometryRelated (); System.out.println (gr.equalsGeo ()); System.out.println (gr.disjointGeo ()); System.out.println (gr.intersectsGeo ()); System.out.println (gr.withinGeo (5,5, "POLYGON ((0 0, 10 0, 10 10, 0 10,0 0))")); } }
Análisis de relaciones
- Existen varios tipos de análisis de relaciones.
Análisis de buffer (Buffer) |
Contiene todos los polígonos y polígonos múltiples dentro de una distancia especificada |
Análisis de casco convexo (casco convexo) |
Casco convexo poligonal que contiene todos los puntos de forma geométrica |
Intersección |
La operación de intersección A∩B es el conjunto de todos los puntos comunes en el polígono AB |
Análisis conjunto (Unión) |
La operación conjunta de AUB AB es el conjunto de todos los puntos de AB |
Análisis de diferencia (diferencia) |
(AA∩B) El análisis de diferencia de la forma AB es el conjunto de todos los puntos en A que no están en B |
Análisis de diferencia simétrica (SymDifference) |
(AUB-A∩B) El análisis de diferencia simétrica de la forma AB es el conjunto de todos los puntos ubicados en A o B pero no en AB |
2. Veamos ejemplos específicos
paquete com.alibaba.autonavi; import java.util.ArrayList; import java.util.List; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.LineString; / ** * gemotry 之间 的 关系 分析 * * @author xingxing.dxx * / public class Operation { private GeometryFactory geometryFactory = new GeometryFactory (); / ** * crear un Punto * * @param x * @param y * @return * / public Coordinate point (double x, double y) { return new Coordinate (x, y); } / ** * crear una línea * * @return * / public LineString createLine (List <Coordinate> points) { Coordinate [] coords = (Coordinate []) points.toArray (new Coordinate [points.size ()]); LineString line = geometryFactory.createLineString (coords); Linea de retorno; } / ** * 返回 a 指定 距离 内 的 多边形 和 多 多边形 * * @param a * @param distance * @return * / public Geometry bufferGeo (Geometry a, double distance) { return a.buffer (distance); } / ** * Devuelve la distancia entre los dos puntos más cercanos en (A) y (B) * * @param a * @param b * @return * / public double distanceGeo (Geometry a, Geometry b) { return a.distance (b); } / ** * La intersección de dos objetos geométricos * * @param a * @param b * @return * / public Geometry intersectionGeo (Geometry a, Geometry b) { return a.intersection (b); } / ** * Geometry Fusión de objetos * * @param a * @param b * @return * / public Geometry unionGeo (Geometry a, Geometry b) { devolver a.union (b); } / ** * Sí en un objeto de geometría A, pero no en un objeto de geometría B * * @param a * @param b * @return * / public Geometry differenceGeo (Geometry a, Geometry b) { return a.difference (b); } public static void main (String [] args) { Operación op = nueva Operación (); // 创建 一条 线 Lista <Coordinate> puntos1 = new ArrayList <Coordinate> (); puntos1.add (punto op. (0, 0)); puntos1.add (punto op. (1, 3)); puntos1.add (punto op. (2, 3)); LineString line1 = op.createLine (puntos1); // 创建 第二 条 线 Lista <Coordinate> puntos2 = new ArrayList <Coordinate> (); puntos2.add (punto op. (3, 0)); puntos2.add (op.point (3, 3)); puntos2.add (punto op. (5, 6)); LineString line2 = op.createLine (puntos2); System.out.println (op.distanceGeo (line1, line2)); // out 1.0 System.out.println (op.intersectionGeo (line1, line2)); // out GEOMETRYCOLLECTION EMPTY System.out.println (op.unionGeo (línea1, línea2)); // out MULTILINESTRING ((0 0, 1 3, 2 3), (3 0, 3 3, 5 6)) System.out.println (op.differenceGeo (line1, line2)); // out LINESTRING (0 0 , 1 3, 2 3) } }