一些高级的操作

  • 几何形状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. CentOS中的常用命令

    1. 网络 1.1 查看所有端口 netstat -ntlp 1.2 查看被打开的端口 netstat -anp 1.3 查看端口占用情况 lsof -i: 或 lsof -i tcp: 2. 硬盘 ...

  2. winform中ComboBox实现text和value,使显示和值分开,重写text和value属性

    winform的ComboBox中只能赋值text,显示和值是一样的,很多时候不能满足根本需要,熟悉B/S开发的coder最常用的就是text和value分开的,而且web下DropDownList本 ...

  3. Stick hero "攻略", android 代码编写与分析(后台截屏, 后台模拟点击)

    论文写完,感觉头脑好久没被灵感刺激了,前些天室友介绍了个小游戏,我突然来了灵感可以写的简单的android 程序实现自动运行.主要的过会为三步: 1,Android 屏幕的获取.因为安全的原因,过程比 ...

  4. oracle之synonym小结

    oracle中的同义词可以认为是对表.视图.序列.存储过程.函数.程序包或者其他同义词的一个别名,也就是用一个别名来映射的作用. oracle中的同义词可以分为私有和公有两种,私有同义词(privat ...

  5. Java应用程序监控JavaMelody

    JavaMelody是运行在Java Web容器中,用来监控Java内存和J服务器CPU使用情况,用户Session数量,JDBC连接数,和http请求.sql请求等的执行数量,平均执行时间,错误百分 ...

  6. SQL优化注意事项

    sql语句优化 性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化. 为了获得稳定的执行性能,SQL语句越简单越好.对复杂的 ...

  7. android-studio设置代理

    /home/{user}/.gradle/gradle.properties org.gradle.jvmargs=-Xmx1536m -DsocksProxyHost=127.0.0.1 -Dsoc ...

  8. python字符串的编码格式

    参考网站: http://www.cnblogs.com/siqi/archive/2012/11/10/2763598.html 环境: win7 x64 python v2.7.10 结论: 1 ...

  9. Django 开发投票系统

    主要参考官方文档 Windows  10 Python 23.5 Django 1.9 1.创建项目(mysite)与应用(polls) D:\python>django-admin.py st ...

  10. Java基础知识:代理

    一.代理的概念 动态代理技术是整个java技术中最重要的一个技术,它是学习java框架的基础,不会动态代理技术,那么在学习Spring这些框架时是学不明白的. 动态代理技术就是用来产生一个对象的代理对 ...