python 泰森多边形边界_geotools中泰森多边形的生成
概述
本文讲述如何在geotools中生成泰森多边形,并shp输出。
泰森多边形
1、定义
泰森多边形又叫冯洛诺伊图(Voronoi diagram),得名于Georgy Voronoi,是由一组由连接两邻点直线的垂直平分线组成的连续多边形组成。
2、建立步骤
建立泰森多边形算法的关键是对离散数据点合理地连成三角网,即构建Delaunay三角网。建立泰森多边形的步骤为:
1)离散点自动构建三角网,即构建Delaunay三角网。对离散点和形成的三角形编号,记录每个三角形是由哪三个离散点构成的。
2)找出与每个离散点相邻的所有三角形的编号,并记录下来。这只要在已构建的三角网中找出具有一个相同顶点的所有三角形即可。
3)对与每个离散点相邻的三角形按顺时针或逆时针方向排序,以便下一步连接生成泰森多边形。设离散点为o。找出以o为顶点的一个三角形,设为A;取三角形A除o以外的另一顶点,设为a,则另一个顶点也可找出,即为f;则下一个三角形必然是以of为边的,即为三角形F;三角形F的另一顶点为e,则下一三角形是以oe为边的;如此重复进行,直到回到oa边。
4)计算每个三角形的外接圆圆心,并记录之。
5)根据每个离散点的相邻三角形,连接这些相邻三角形的外接圆圆心,即得到泰森多边形。对于三角网边缘的泰森多边形,可作垂直平分线与图廓相交,与图廓一起构成泰森多边形。
3、特征
1)每个泰森多边形内仅含有一个离散点数据;
2)泰森多边形内的点到相应离散点的距离最近;
3)位于泰森多边形边上的点到其两边的离散点的距离相等。
geotools中的生成
1、创建测试点
int xmin = 0, xmax=180;
int ymin = 0, ymax=90;
Random random = new Random();
List geomsPoints = new ArrayList();
for(int i=0;i<100;i++){
int x = random.nextInt(xmax)%(xmax-xmin+1) + xmin,
y = random.nextInt(ymax)%(ymax-ymin+1) + ymin;
Coordinate coord = new Coordinate(x,y,i);
coords.add(coord);
clipEnvelpoe.expandToInclude(coord);
geomsPoints.add(new GeometryFactory().createPoint(coord));
}
2、生成泰森多边形
voronoiDiagramBuilder.setSites(coords);
voronoiDiagramBuilder.setClipEnvelope(clipEnvelpoe);
Geometry geom = voronoiDiagramBuilder.getDiagram(JTSFactoryFinder.getGeometryFactory());
List geoms = new ArrayList();
for(int i=0;i
geoms.add(geom.getGeometryN(i));
}
完整代码如下:
package com.lzugis.geotools;
import java.io.File;
import java.io.Serializable;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import org.geotools.data.FeatureWriter;
import org.geotools.data.Transaction;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.shapefile.ShapefileDataStoreFactory;
import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
import org.geotools.geometry.jts.JTSFactoryFinder;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.Polygon;
import com.vividsolutions.jts.triangulate.VoronoiDiagramBuilder;
public class TsdbxTest {
static TsdbxTest tsdbx = new TsdbxTest();
public void voronoiTest(){
VoronoiDiagramBuilder voronoiDiagramBuilder = new VoronoiDiagramBuilder();
List coords = new ArrayList();
Envelope clipEnvelpoe = new Envelope();
int xmin = 0, xmax=180;
int ymin = 0, ymax=90;
Random random = new Random();
List geomsPoints = new ArrayList();
for(int i=0;i<100;i++){
int x = random.nextInt(xmax)%(xmax-xmin+1) + xmin,
y = random.nextInt(ymax)%(ymax-ymin+1) + ymin;
Coordinate coord = new Coordinate(x,y,i);
coords.add(coord);
clipEnvelpoe.expandToInclude(coord);
geomsPoints.add(new GeometryFactory().createPoint(coord));
}
String pointpath = "d:/data/tsdbxpt.shp";
tsdbx.writeShape(pointpath,"Point", geomsPoints);
voronoiDiagramBuilder.setSites(coords);
voronoiDiagramBuilder.setClipEnvelope(clipEnvelpoe);
Geometry geom = voronoiDiagramBuilder.getDiagram(JTSFactoryFinder.getGeometryFactory());
List geoms = new ArrayList();
for(int i=0;i
geoms.add(geom.getGeometryN(i));
}
String polygonpath = "d:/data/tsdbx.shp";
tsdbx.writeShape(polygonpath,"Polygon", geoms);
}
/**
*
* @param filepath
* @param geoType
* @param geoms
*/
public void writeShape(String filepath, String geoType, List geoms) {
try {
//创建shape文件对象
File file = new File(filepath);
Map params = new HashMap();
params.put( ShapefileDataStoreFactory.URLP.key, file.toURI().toURL() );
ShapefileDataStore ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params);
//定义图形信息和属性信息
SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder();
tb.setCRS(DefaultGeographicCRS.WGS84);
tb.setName("shapefile");
if(geoType=="Point"){
tb.add("the_geom", Point.class);
}
else{
tb.add("the_geom", Polygon.class);
}
ds.createSchema(tb.buildFeatureType());
//设置编码
Charset charset = Charset.forName("GBK");
ds.setCharset(charset);
//设置Writer
FeatureWriter writer = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT);
for(int i=0,len=geoms.size();i
//写下一条
SimpleFeature feature = writer.next();
Geometry geom = geoms.get(i);
feature.setAttribute("the_geom", geom);
}
writer.write();
writer.close();
ds.dispose();
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args){
long start = System.currentTimeMillis();
tsdbx.voronoiTest();
System.out.println("共耗时"+(System.currentTimeMillis() - start)+"ms");
}
}
参考文献:
---------------------------------------------------------------------------------------------------------------
技术博客
CSDN:http://blog.csdn.NET/gisshixisheng
博客园:http://www.cnblogs.com/lzugis/
在线教程
http://edu.csdn.Net/course/detail/799
Github
https://github.com/lzugis/
联系方式
q q:1004740957
e-mail:niujp08@qq.com
公众号:lzugis15
Q Q 群:452117357(webgis)
337469080(Android)
python 泰森多边形边界_geotools中泰森多边形的生成相关推荐
- 随机数写excel java代码_基于python实现在excel中读取与生成随机数写入excel中
搜索热词 具体要求是:在一份已知的excel表格中读取学生的学号与姓名,再将这些数据放到新的excel表中的第一列与第二列,最后再生成随机数作为学生的考试成绩. 首先要用到的数据库有:xlwt,xlr ...
- python 泰森多边形边界_简单泰森多边形的绘制
本期介绍泰森多边形,又叫沃罗诺伊图 (Voronoi diagram). 混乱博物馆曾做过一期详实通俗的介绍:怎样画树叶 混乱博物馆_腾讯视频v.qq.com 来源 : 看完了这个视频,我们对 Vo ...
- python 制作高斯mask_Python中numpy如何生成mask图像
有的小伙伴对numpy如何生成mask图像产生了疑问,今天就这个问题为大家进行解答. 在numpy中,有一个模块叫做ma,这个模块几乎复制了numpy里面的所有函数,当然底层里面都换成了对自己定义的新 ...
- 用python自动化在excel中读取与生成随机数
两种方法 1.使用excel自带的随机数函数,=Randbetween(1,2000)在excel生成后在用python读取(备注:只限于单元格,若单元格有多个参数则不适用) 2.通过eval函数把读 ...
- 使用Python读取Mysql数据库中股票信息并生成6日涨幅趋势图,绘制出规范的Excal表格
一.数据库导入股票数据 爬虫或其他工具获取数据,并转换为Excel表,然后导入数据库中. 我的如下: 二.创建函数,编写存储过程 1.mysql存储过程 CREATE DEFINER=`root`@` ...
- python 泰森多边形边界_对于给定点集的泰森多边形的算法实现
百度百科 泰森多边形又叫冯洛诺伊图(Voronoi diagram),得名于Georgy Voronoi,是由一组由连接两邻点线段的垂直平分线组成的连续多边形组成. 泰森多边形是对空间平面的一种剖分, ...
- python 泰森多边形边界_泰森多边形
首先来介绍一下泰森多边形: http://baike.baidu.com/link?url=LJh2DpARPjkmH3OUKHnW6pKg5AxjZdJLxrGanoJr2WApK2_j87MK1R ...
- python 泰森多边形边界_泰森多边形voronoi以及delaunay基本知识,python实现代码待补充...
泰森多边形(Voronoi图)生成算法 一.文档目的 本文描述了在geomodel模块中,生成泰森多边形所使用的算法. 二.概述 GIS和地理分析中经常采用泰森多边形进行快速插值,和分析地理实体的影响 ...
- ArcMap中面要素生成Voronoi图(V图)或者泰森多边形
一.Voronoi图 1.定义 荷兰气候学家A·H·Thiessen提出了一种根据离散分布的气象站的降雨量来计算平均降雨量的方法,即将所有相邻气象站连成三角形,作这些三角形各边的垂直平分线,于是每个气 ...
- Python中random模块生成随机数详解
Python中random模块生成随机数详解 本文给大家汇总了一下在Python中random模块中最常用的生成随机数的方法,有需要的小伙伴可以参考下 Python中的random模块用于生成随机数. ...
最新文章
- Oracle ASM 翻译系列第二十七弹:ASM INTERNAL ASM METADATA BLOCK
- 提防iostream使用中的一个“陷阱”
- 37. Sudoku Solver **
- HCTF 2018:WarmUp(源代码详解)
- choiceformat_ChoiceFormat:数字范围格式
- 注册和登录还有那个加密的密码
- Nginx的11个执行流程
- Angular的@Output与@Input理解
- python实现按回车键继续程序_python实现按任意键继续执行程序
- 多点Dmall发布系统Mini OS 宣称要五年覆盖百万门店
- visio交叉线去掉交叉点弯曲方法
- AI风向标:发改委重大工程项目公布,首个无人车路测试点落户亦庄
- 灵活地横向扩展:从文件系统到分布式文件系统
- 我在用的多功能电子书阅读器
- 03-0006 Python批量查询手机归属地
- redis集群-局域网中两台电脑通信
- White自动化测试培训大纲
- 微信小程序小功能分享一( canves制图之后台base64图片转为微信临时文件)
- my love(新贵公子主题歌)铃声 my love(新贵公子主题歌)手机铃...
- 【django】简易视频播放功能
热门文章
- Edge浏览器打不开网页解决方法教学
- DedeCMS 栏目三级联动树形菜单的代码
- hosts文件在哪里,怎样配置修改hosts文件
- html、css做一个带搜索图标的搜索框(方法分享)
- IntelliJ IDEA Dependency 'XXXX' not found 或 java:程序包XXXX不存在,找不到的解决方案
- 有关E45: ‘readonly‘ option is set (add!to override)错误的解决方法
- php中eregi,PHP 函数 eregi()
- cosh和acosh--双曲余弦和反双曲余弦函数
- 电脑常用工具集(开发,windows,持续更新)
- 高通apq8098平台sd卡总结