一些高级的操作

  • 几何形状Geometry缓冲(buffer)
  • 线段的融合(linemerge)是将Geometry A中相互连接的线段进行连接
  • 多边形化操作(polygonize)对Geometry A进行计算,返回一个多边形(Polygon)。将由许多个点表示的图形,用少量的点来表示,减少图形的信息,即对图形进行降维
  • 凹壳分析,包含几何形体的所有点的最小凸壳多边形(外包多边形)

相关的代码实现

  • 工厂
package com.alibaba.autonavi;

import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKTReader; public class GeometryFactory { private WKTReader reader; private static GeometryFactory instance = null; public static synchronized GeometryFactory getInstance(){
if(instance==null){
instance = new GeometryFactory();
}
return instance;
} public void getReader(){
reader = new WKTReader();
} public Geometry buildGeometryByWkt(String str){
try {
if(reader==null){
reader = new WKTReader();
}
return reader.read(str);
} catch (ParseException e) {
throw new RuntimeException("buildGeometry Error",e);
}
} }
  • buffer操作

buffer在GIS中是用于计算Geometry的给定距离内包含所有点的区域的操作


package com.alibaba.autonavi; import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.operation.buffer.BufferOp; /**
* bufferdemo
* @author xingxing.dxx
*
*/
public class BufferDemo { private static GeometryFactory factory = GeometryFactory.getInstance(); public static void main(String[] args) {
BufferDemo bs = new BufferDemo();
String line = "LINESTRING (0 0, 1 1, 2 2,3 3)";
Geometry g1 = factory.buildGeometryByWkt(line);
//方式(一)
Geometry g = g1.buffer(2); ////方式(二) BufferOP
BufferOp bufOp = new BufferOp(g1);
bufOp.setEndCapStyle(BufferOp.CAP_BUTT);
Geometry bg = bufOp.getResultGeometry(2);
}
}
  • Polygonization

package com.alibaba.autonavi; import java.util.ArrayList;
import java.util.List;
import java.util.Collection; import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.operation.polygonize.Polygonizer; public class Polygonization { private static GeometryFactory factory = GeometryFactory.getInstance(); public static void main(String[] args) {
List<Geometry> list = new ArrayList<Geometry>();
list.add(factory.buildGeometryByWkt("LINESTRING (0 0,1 1)"));
list.add(factory.buildGeometryByWkt("LINESTRING (6 3,6 10)"));
list.add(factory.buildGeometryByWkt("LINESTRING (2 2,4 4,6 3)"));
list.add(factory.buildGeometryByWkt("LINESTRING (2 2,5 1,6 3)"));
list.add(factory.buildGeometryByWkt("LINESTRING (6 3,6 4)"));
list.add(factory.buildGeometryByWkt("LINESTRING (9 5,7 1,6 4)"));
list.add(factory.buildGeometryByWkt("LINESTRING (9 5,8 8,6 4)"));
Polygonizer p = new Polygonizer();
p.add(list);
Collection<Geometry> polys = p.getPolygons(); //面
Collection<Geometry> dangles = p.getDangles();//悬挂线
Collection<Geometry> cuts = p.getCutEdges(); //面和面的连接线
System.out.println(polys.size()+":"+polys.toString());
System.out.println(dangles.size()+":"+dangles.toString());
System.out.println(cuts.size()+":"+cuts.toString());
}
}
  • MergerLine
package com.alibaba.autonavi;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.operation.linemerge.LineMerger; public class MergerLine { private static GeometryFactory factory = GeometryFactory.getInstance(); public static void main(String[] args) {
LineMerger lineMerger = new LineMerger();
List<Geometry> list = new ArrayList<Geometry>();
list.add(factory.buildGeometryByWkt("LINESTRING (3 3,2 2,0 0)"));
list.add(factory.buildGeometryByWkt("LINESTRING (3 3,6 6,0 10)"));
list.add(factory.buildGeometryByWkt("LINESTRING (0 10,3 1,10 1)"));
lineMerger.add(list);
Collection<Geometry> mergerLineStrings = lineMerger.getMergedLineStrings();
for (Geometry g : mergerLineStrings) {
System.out.println(g.toText());
}
}
}
package com.alibaba.autonavi; import java.util.ArrayList;
import java.util.List; import com.vividsolutions.jts.geom.Geometry; public class UnionLine { private static GeometryFactory factory = GeometryFactory.getInstance(); public static void main(String[] args) {
List<Geometry> list = new ArrayList<Geometry>();
list.add(factory.buildGeometryByWkt("LINESTRING (10 10,2 2,0 0)"));
list.add(factory.buildGeometryByWkt("LINESTRING (10 0,6 6,0 10)"));
list.add(factory.buildGeometryByWkt("LINESTRING (1 1,3 1,10 1)"));
Geometry nodedLine = list.get(0);
for (int i = 1; i < list.size(); i++) {
nodedLine = nodedLine.union(list.get(i));
}
int num = nodedLine.getNumGeometries();
for (int j = 0; j < num; j++) {
Geometry eachG = nodedLine.getGeometryN(j);
System.out.println(eachG.toText());
}
}
}

注意点

在使用buffer的时候发现一个比较奇怪的现象

如下图所示:link和求出的 buffer

通过检查输入数据,发现是因为 link的坐标是无序的,所以才出现了这个问题

                 lng                lat
1 119.53290332862665 35.392994649858394
2 119.532898 35.393353
3 119.532898 35.39335233694318

最后附上上述图形相关的生成R语言代码

library(rgeos)
library(leaflet) wkt <- "POLYGON ((119.53264429320605 35.393349227408265, 119.53277114660303 35.39335111370413, 119.53293568134956 35.39335233694318, 119.53264426515858 35.39335233694318, 119.53264426515858 35.393353, 119.53265656750867 35.3934310494835, 119.53269228159844 35.39350153049857, 119.53274794422803 35.39355760849212, 119.5328181577851 35.3935938455739, 119.532896113652 35.39360672782946, 119.53297425243832 35.3935950060648, 119.53304499701589 35.39355981694096, 119.53310148727397 35.39350457275179, 119.53313824534494 35.39343463053341, 119.53315170679396 35.39335677259173, 119.5331570354206 35.39299842245013, 119.53264962183269 35.39299087726666, 119.53264429320605 35.393349227408265))"
readWKT(wkt) -> polygon linestring <- "LINESTRING (119.53290332862665 35.392994649858394, 119.532898 35.393353, 119.532898 35.39335233694318)"
readWKT(linestring) -> line point_str <- "POINT (119.532856 35.393564)"
readWKT(point_str) -> point leaflet() %>% addPolygons(data = polygon) %>% addPolylines(data = line)

Geometry关系高级操作的更多相关文章

  1. SpringBoot应用操作Rabbitmq(fanout广播高级操作)

    一.广播模式fanout.不需要指定路由key. 注:与topic和direct区别是:fanout广播模式会两个队列同时发送相同的消息,并非由交换器转发到某一个队列 二.实战(广播模式) 1.引入m ...

  2. SpringBoot应用操作Rabbitmq(topic交换器高级操作)

    一.topic交换器为主题交换器,可以根据路由key模糊匹配 实现模型图 二.实战 1.引入maven <dependency> <groupId>org.springfram ...

  3. SpringBoot应用操作Rabbitmq(direct高级操作)

    一.首先声明完成任务架构,通过direct订阅/发布的模式进行生产消费. a.消息生产指定交换器和路由key b.消费者绑定交换器,路由key和队列的关系(集群监控收到的消息不重复) 二.实战演练 1 ...

  4. 数据分析05 /pandas的高级操作

    数据分析05 /pandas的高级操作 目录 数据分析05 /pandas的高级操作 1. 替换操作 2. 映射操作 3. 运算工具 4. 映射索引 / 更改之前索引 5. 排序实现的随机抽样/打乱表 ...

  5. pandas高级操作

    pandas高级操作 import numpy as np import pandas as pd from pandas import DataFrame,Series 替换操作 替换操作可以同步作 ...

  6. [Session] SessionHelper2---C#关于Session高级操作帮助类 (转载)

    点击下载 SessionHelper2.rar 这个类是关于Session的一些高级操作1.添加时限制时间2.读取对象3.读取数据等等看下面代码吧 /// <summary> /// 联系 ...

  7. cassandra高级操作之索引、排序以及分页

    本次就给大家讲讲cassandra的高级操作:索引.排序和分页:处于性能的考虑,cassandra对这些支持都比较简单,所以我们不能希望cassandra完全适用于我们的逻辑,而是应该将我们的逻辑设计 ...

  8. HTML DOM元素关系与操作

    <html> <head><title>DOM元素关系与操作</title></head> <body> <!-- div ...

  9. MySQL学习笔记_9_MySQL高级操作(上)

    MySQL高级操作(上) 一.MySQL表复制 create table t2 like t1;               #复制表结构,t2可以学习到t1所有的表结构 insert into t2 ...

随机推荐

  1. linux 添加静态ip dns

    /etc/network 下:interfaces auto loiface lo inet loopbackauto eth0iface eth0 inet staticaddress 192.16 ...

  2. SQL语句之备份表

    SELECT INTO 语句:表示从一个表中选取数据,然后把数据插入另一个表中,常用来备份一张表 1.全表结构备份: SELECT * INTO new_table_name FROM old_tab ...

  3. opencv2.4.9在ubuntu(树莓派)上安装

    参考原文:https://my.oschina.net/u/1757926/blog/293976 1. 先从sourceforge上下载OpenCV的源码 http://jaist.dl.sourc ...

  4. Java生成与解析二维码

    1.下载支持二维码的jar包qrcode.jar和qrcode_swetake.jar, 其中qrcode_swetake.jar用于生成二维码,rcode.jar用于解析二维码,jar包下载地址(免 ...

  5. C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法

    因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密.在网上查了很久也没有很好的实现.BouncyCastle的文档少之又少.很多人可能会说,C#也是可以的,通过Biginteger ...

  6. OJ提交题目中的语言选项里G++与C++的区别(转)

    G++? 首先更正一个概念,C++是一门计算机编程语言,G++不是语言,是一款编译器中编译C++程序的命令而已. 那么他们之间的区别是什么? 在提交题目中的语言选项里,G++和C++都代表编译的方式. ...

  7. [转]windows 短文件名/短路径名规则

    How Windows Generates 8.3 File Names from Long File Names Windows generates short file names from lo ...

  8. 【HOW】在InfoPath中如何为浏览和编辑模式设置不同的视图

    1. 在SharePoint Designer中打开要自定义视图的列表.并点击菜单:列表设置 > 在 InfoPath 中设计表单 > {要自定义表单的内容类型},则会自动打开InfoPa ...

  9. 通过seekBar改变图片的透明度

    作者:堕落的天使 对应的图片 activity_main.xml(代码) <RelativeLayout xmlns:android="http://schemas.android.c ...

  10. 3、NASA NIST Big Data Architecture

    这篇关于大数据应用的讲解太好了,直接上图.Mattmann_S1P8_ESTF2015 来自为知笔记(Wiz)