海量多边形矢量并行平滑实现

最近工作需要对提取的矢量图斑进行平滑(shp格式),所以就对这里进行了一点小小的研究,主要是对Chaikin-curve算法进行改进,其实还有很多优秀的算法可以拿来用,迫于时间,就没有继续深入,

这篇博客,权当是抛砖引玉,希望真正搞平滑算法的”同志们“,能够展示出自己真正的优秀算法。我们知道,当多边形数量为几百个,几千个,可能cpu串行和并行计算效率差距不大,但是当数量突破万个,几十万个,几百万个呢?

串行明显就不行了,所以我这里探索了并行矢量平滑算法。。。我在后面开源了代码,如果各位对代码有疑问或者需要理解的,qq:1044625113,备注:矢量并行处理

我计算了12万个多边形, 计算效率对比,如下表所示:

计算模式 计算时间(秒)
串行 70 
并行(四核)  20

节省了整整三倍啊,兄弟们,这个很爽啊!

图 原始矢量图斑

图 平滑后矢量图斑

下面贴上矢量平滑的主函数代码:

% chaikin-curve ????????????????
% written by Mr zhipan Wang,Email:[email protected],BeiJing,2019-10-21
% refer:https://www.cnblogs.com/hongru/archive/2011/10/27/2226946.html

clear
tic

%% read shape file
ShpFileName = ‘????????????.shp‘;
[shp,attribute] = shaperead(ShpFileName);

Scale = 3;                                        % ??????????????????
Iter = 6;                                         % ????????????????

% figure,mapshow(shp),title(‘original shapefile!‘)

%% curve smooth
numPolygon = length(shp);

STR = ‘struct(‘‘Geometry‘‘,values ,‘‘X‘‘, values,‘‘Y‘‘, values,‘‘ID‘‘,values)‘;
values = cell(numPolygon, 1);                     % ????????帳??????,??????????????????????????????????,????????????????dbf??????,??????????????????????
newSHP = eval(STR);

parfor i = 1:numPolygon                           % ??????????????

    Latitude_arrary = shp(i).Y;
    Longitude_array = shp(i).X;

    [Smooth_Lati, Smooth_Longi] = ChaikinCurve_Smooth(Latitude_arrary, Longitude_array, Scale, Iter);

    newSHP(i).X = Smooth_Longi;
    newSHP(i).Y = Smooth_Lati;
    newSHP(i).ID = i-1;
    newSHP(i).Geometry = ‘Polygon‘;

    fprintf([‘??????????‘,num2str(numPolygon),‘??????????????, ‘,‘????‘, num2str(i), ‘??????????????????????????...\n‘]);

end
clear shp

% figure,mapshow(newSHP),title(‘smooth shpfile!‘)     % ????????????ν??????????????????????,????????????????????????????????

%% export shape file
shapewrite(newSHP,‘smoothSHP.shp‘);

toc

  贴上实现的函数代码:

function [Smooth_Lati, Smooth_Longi] = ChaikinCurve_Smooth(Latitude_arrary, Longitude_array, Scale, Iter)
% CK 曲线平滑算法的核心实现, Email:[email protected],BeiJing,2019-10-21!
% Latitude_arrary: 纬度数组
% Longitude_array: 经度数组
% Scale: 尺度参数, 正整数
% Iter: 迭代次数,一般四次即可!

if length(Latitude_arrary) ~= length(Longitude_array)

    fprintf(‘数组大小不一致...\n‘);
    return;

end

if Scale < 1

    fprintf(‘尺度参数应该大于1...\n‘);
    return;

end

% 迭代实现
for i = 1:Iter

    [Latitude_arrary, Longitude_array] = addPoint(Latitude_arrary, Longitude_array, Scale);

end

Smooth_Lati = Latitude_arrary;
Smooth_Longi = Longitude_array;

end

  总的来说,只需要设置迭代次数就可以了,平滑度参数默认3即可,迭代次数设置成3-6次基本上够用了,先写到这里吧

原文地址:https://www.cnblogs.com/wzp-749195/p/11717955.html

时间: 2024-10-12 11:09:01

海量多边形矢量并行平滑实现的相关文章

&lt; 转&gt;百度与深度学习

作者 余凯,百度技术副总监,千人计划国家特聘专家. 贾磊,百度主任架构师,语音技术负责人. 陈雨强,百度商务搜索部资深研发工程师,负责搜索广告 CTR 预估 摘要:深度学习带来了机器学习的新浪潮,推动"大数据+深度模型"时代的来临,以及人工智能和人机交互大踏步前进.如果我们能在理论.建模和工程方面突破深度学习面临的一系列难题,人工智能的梦想不再遥远. 2012 年 6 月,<纽约时报>披露了 Google Brain 项目,吸引了公众的广泛关注.这个项目是由著名的斯坦福大学

Web开发人员不要错过的60款用户界面设计工具(中)

21. Dojo Dojo是一个用javascript语言实现的开源DHTML UI工具包,可实现高性能的桌面和移动应用程序开发,在国内亦有大量忠实用户. 22. Fivesecondtest Fivesecondtest可以优化你的登陆界面,并分析设计中最突出的元素. 23. Android UI Elements Set 集合了大量Android OS UI元素,并且全部都是免费的. 24. Massive Web UI and Button Set Massive Web UI and B

【转帖】深度学习:推进人工智能的梦想

深度学习:推进人工智能的梦想 发布日期:2014.07.14  浏览次数:58次 深度学习:采用无监督学习,获得更有用的特征(不需要人工抽取特征),以实现各种分类和预测目标,结合高性能计算,提高效率. 通篇文字给人传递的信息就是,百度比Google牛,事实真的如此吗?各位有什么看法? 2012年6月,<纽约时报>披露了Google Brain项目,吸引了公众的广泛关注.这个项目是由著名的斯坦福大学机器学习教授Andrew Ng和在大规模计算机系统方面的世界顶尖专家Jeff Dean共同主导,用

MaterialIDsRandomGenerator for 3dsMax使用教程

材质ID随机生成器(英文:MaterialIDs Random Generator 缩写:MIRG)使用教程 名称: 材质ID随机生成器(英文:Material IDs Random Generator 缩写:MIRG) 功能介绍: 材质ID随机生成器(英文:Material IDs Random Generator 缩写:MIRG),沐风课堂"彩虹系列"for3dsMax 工具,是一款用MAXScript脚本语言开发的小工具,可以为可编辑多边形对象随机分配材质ID,同时生成并赋予一个

《云计算架构技术与实践》连载(13)2.3 云计算核心架构竞争力衡量维度

版权全部,未经华为书面许可.请勿转载或转发 2.3       云计算核心架构竞争力衡量维度 从将云计算技术引入传统数据中心所带来的独特商业价值角度看,重点能够从开源与节流两个方面来衡量云计算的核心竞争力. 节流(Cost Saving)方面 在业务系统搭建过程中.云计算和虚拟化使得企业及运营商的烟囱式软件应用能够突破应用边界的束缚,充分共享企业范围内.行业范围内.甚至全球范围内公用的"IT资源池",无需採购和安装实际物理形态的server.交换机及存储硬件,而是依赖于向集中的&quo

旋转卡壳算法及应用 (参考论文)

多看论文开眼界! 转自:http://blog.csdn.net/acmaker/article/details/3188177 一.目录 一些历史: 1978年, M.I. Shamos's Ph.D. 的论文"Computational Geometry"标志着计算机科学的这一领域的诞生. 当时他发表成果的是一个寻找凸多边形直径的一个非常简单的算法, 即根据多边形的一对点距离的最大值来确定. 后来直径演化为由一对对踵点对来确定. Shamos提出了一个简单的 O(n) 时间的算法来

旋转卡壳总结

[+] 目录(?)[+] 以下所有文章均转载( http://blog.csdn.net/acmaker/article/details/3176910) 转载请注明出处! 1.旋转卡壳——翻译说明文档 前一段时间看了一位国外大牛的网站,是关于旋转卡壳技术的,内容很不错,就尝试着翻译一下. 关于旋转卡壳技术,最早是在刘汝佳.黄亮的<算法艺术与信息学竞赛>上看到的,是计算几何相关的技术,开始觉得很神奇,因为其对于凸多边形的问题给出了很好的解决方案,于是上网查了一下,就发现了这份资料. 通过个人的

栅格数据和矢量数据

栅格数据结构 栅格结构是以规则的阵列来表示空间地物或现象分布的数据组织,组织中的每个数据表示地物或现象的非几何属性特征. 栅格结构的显著特点:属性明显,定位隐含,即数据直接记录属性的指针或数据本身,而所在位置则根据行列号转换为相应的坐标. 栅格数据的编码方法:直接栅格编码,就是将栅格数据看作一个数据矩阵,逐行(或逐列)逐个记录代码:压缩编码,包括 链码(弗里曼链码)比较适合存储图形数据: 游程长度编码通过记录行或列上相邻若干属性相同点的代码来实现: 块码是有成长度编码扩展到二维的情况,采用方形区

(数据科学学习手札65)利用Python实现Shp格式向GeoJSON的转换

一.简介 Shp格式是GIS中非常重要的数据格式,主要在Arcgis中使用,但在进行很多基于网页的空间数据可视化时,通常只接受GeoJSON格式的数据,众所周知JSON(JavaScript Object Nonation)是利用键值对+嵌套来表示数据的一种格式,以其轻量.易解析的优点,被广泛使用与各种领域,而GeoJSON就是指在一套规定的语法规则下用JSON格式存储矢量数据,本文就将针对GeoJSON的语法规则,以及如何利用Python完成Shp格式到GeoJSON格式的转换进行介绍. 二.