Geometry关系高级操作
一些高级的操作
- 几何形状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关系高级操作的更多相关文章
- SpringBoot应用操作Rabbitmq(fanout广播高级操作)
一.广播模式fanout.不需要指定路由key. 注:与topic和direct区别是:fanout广播模式会两个队列同时发送相同的消息,并非由交换器转发到某一个队列 二.实战(广播模式) 1.引入m ...
- SpringBoot应用操作Rabbitmq(topic交换器高级操作)
一.topic交换器为主题交换器,可以根据路由key模糊匹配 实现模型图 二.实战 1.引入maven <dependency> <groupId>org.springfram ...
- SpringBoot应用操作Rabbitmq(direct高级操作)
一.首先声明完成任务架构,通过direct订阅/发布的模式进行生产消费. a.消息生产指定交换器和路由key b.消费者绑定交换器,路由key和队列的关系(集群监控收到的消息不重复) 二.实战演练 1 ...
- 数据分析05 /pandas的高级操作
数据分析05 /pandas的高级操作 目录 数据分析05 /pandas的高级操作 1. 替换操作 2. 映射操作 3. 运算工具 4. 映射索引 / 更改之前索引 5. 排序实现的随机抽样/打乱表 ...
- pandas高级操作
pandas高级操作 import numpy as np import pandas as pd from pandas import DataFrame,Series 替换操作 替换操作可以同步作 ...
- [Session] SessionHelper2---C#关于Session高级操作帮助类 (转载)
点击下载 SessionHelper2.rar 这个类是关于Session的一些高级操作1.添加时限制时间2.读取对象3.读取数据等等看下面代码吧 /// <summary> /// 联系 ...
- cassandra高级操作之索引、排序以及分页
本次就给大家讲讲cassandra的高级操作:索引.排序和分页:处于性能的考虑,cassandra对这些支持都比较简单,所以我们不能希望cassandra完全适用于我们的逻辑,而是应该将我们的逻辑设计 ...
- HTML DOM元素关系与操作
<html> <head><title>DOM元素关系与操作</title></head> <body> <!-- div ...
- MySQL学习笔记_9_MySQL高级操作(上)
MySQL高级操作(上) 一.MySQL表复制 create table t2 like t1; #复制表结构,t2可以学习到t1所有的表结构 insert into t2 ...
随机推荐
- Inventor 2014 sp1/sp2激活
问题: win8.1 inventor2014,不打补丁不兼容: 打了补丁xforce激活始终无法成功. 解决: 1. 使用未打补丁之前的 adlmact.dll 和 adlmact_libFNP.d ...
- RegOpenKeyEx和RegSetValueEx返回ERROR_SUCCESS,但注册表未发生变化。
win7 x64,需要open的时候加上KEY_WOW64_64KEY. lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microso ...
- 获取ICommand的图片
BarButtonItem item = (BarButtonItem)e.Item; System.IntPtr _Handle = (System.IntPtr)(cmd as ICommand) ...
- IOS-UITextField键盘不隐藏问题
这久在手机也页面做了注册功能,需要很多的UITextField,有些是手动输入文字的,有些是点击下拉框选择的,这就出现了当点击下拉框时,就需要将键盘隐藏. - (void)textFieldDidBe ...
- ESXi查询网卡的驱动和固件版本
~ # esxcfg-nics -lName PCI Driver Link Speed Duplex MAC Address MTU Description vmnic0 0000:01:00.00 ...
- Visual studio 类视图和资源视图不显示的问题
关于Visual studio 类视图和资源视图不显示的问题 解决方法: 1. 工具—选项—文本编辑器—C/C++—高级,浏览/导航下的禁用数据库选项置为False; 2. 输入命令:devenv / ...
- javascript Date
转:http://blog.csdn.net/vbangle/article/details/5643091# // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日( ...
- 源码阅读笔记 - 2 std::vector (2) 关于Allocator Aware Container特性
所有的STL容器,都保存一个或默认,或由用户提供的allocator的实例,用来提供对象内存分配和构造的方法(除了std::array),这样的容器,被称作Allocator Aware Contai ...
- (.text+0x12): undefined reference to `rpl_fprintf'
问题1:(.text+0x12): undefined reference to `rpl_fprintf'解决办法:在yacc前面添加%{#undef yyerrorvoid yyerror (ch ...
- linux备份mysq脚本
filename=`date +%Y%m%d_%H%M%S`database=finebwservername=officialcreatefilename=${servername}_${datab ...