PDERL:基于DEM的快速精确通视域分析算法介绍(二)

2023-11-02 06:20

本文主要是介绍PDERL:基于DEM的快速精确通视域分析算法介绍(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PDERL/XPDERL算法示例工程介绍

PDERL: 精度与R3相同,速度约为XDraw一半;
XPDERL:精度约为XDraw和参考面算法的4-10倍,速度在近地面约为XDraw一倍,在高空略快于XDraw,略慢于参考面算法

系列文章:
PDERL:基于DEM的快速精确通视域分析算法介绍(一)
PDERL:基于DEM的快速精确通视域分析算法介绍(二)


文章目录

  • PDERL/XPDERL算法示例工程介绍
  • 项目介绍
  • 恢复工程
  • 运行和测试
  • 代码简介
    • 修改端口
    • 服务入口
      • 1. 获取DEM数据列表以及当前DEM:
      • 2. 设置某DEM为当前计算数据
      • 3. PDERL服务:
      • 4. XPDERL服务:
      • 5. 实验1:速度测试(论文原标题:Experiment 1: speed):
      • 6. 实验2:精度实验(论文原标题:Experiment 2: accuracy):
      • 7. 实验3:错误点聚集程度实验(论文原标题:Experiment 3: aggregation of error points):
    • PDERL和XPDERL的函数
      • 1. PDERL:
      • 2. XPDERL:


最近基于PDERL研发XPDERL算法,算是基本完成了,相关代码已上传到Github中,我们为新的算法重新编写了Readme文件,这对引导算法测试和代码阅读很有帮助,所以就同步发布到CSDN平台了,示例代码工程获取:https://github.com/blct-w/Pedrl-Algorithm

项目介绍

该项目是PDERL和XPDERL算法的测试项目,项目以Restful WebAPI的形式提供了系列计算服务以及一个测试页面。项目在.net core 2.1框架下采用c#在vs2019中开发。

基于规则网格数字高程模型(DEM)的视域分析是地理信息系统的基本功能之一。传统的视域分析算法主要是在地理空间坐标系中进行的,当需要准确计算通视域时会面临原理简单但计算量巨大的问题,只能通过使用近似方法来减少计算量,但这是以牺牲精度为代价的。尽管近似算法(比如XDraw、R2、参考面算法)的错误率在数值上比较地,但它们结果的错误点分布不均匀,极有可能造成连续的区域性计算错误。尽管近十年来DEM数据的质量有了显著的提高,但传统的近似算法已经无法充分利用现代DEM的精度优势。

PDERL和XPDERL建立了“临近度-方向-俯仰度”(PDE)坐标系,并在精度和速度上得到了很大的提高。实验证明,PDERL算法的精度与R3算法相同,速度大约是XDraw和参考平面算法的一半,但远快于R3算法。XPDERL的计算速度在高空比较稳定,略快于XDraw,略慢于参考平面算法;然而,在离地面较低的高度,它比两者都要快得多,尤其是在接近地面的山区。并且,XPDERL不存在假阴性错误(将可见点识别为不可见点),与传统视域分析算法相比,在中提上错误率和错误点聚集程度都得到了显著的降低。

关于PDERL的更多信息请参考我们的论文:Wu, C., Guan, L., Xia, Q. et al. PDERL: an accurate and fast algorithm with a novel perspective on solving the old viewshed analysis problem. Earth Sci Inform 14, 619–632 (2021). https://doi.org/10.1007/s12145-020-00545-7
或CSDN博文:https://blog.csdn.net/springberlin/article/details/109459773

风险提示:我们团队研究的该算法属于职务成果,已被大学提交国家专利局进行专利申请。发布此工程的主要目的是为了方便国内做地理信息工程的程序员们读懂算法的核心思想,复现算法,应用于研究、学习等。但是计划将该算法用于商业目的的小伙伴们请注意:我们是算法发明人,不是专利申请人(申请人是大学组织),无法对您进行使用授权,如果您计划将其应用于商业项目,我们强烈建议您首先联系大学或发邮件给我代为咨询:blct_w@foxmail.com。

恢复工程

如果您想恢复代码工程并尝试修改它,请按照以下步骤恢复项目。如果您不打算阅读这些代码,也可以跳过这一节,我们提供了一套编译好的可执行文件,可以直接运行(详见下一节)。

  1. 这个程序依赖于:.net Core 2.1 框架。如果需要,可以从这里下载SDK:.net core 2.1。
  2. 安装Visual Studio 2019 (VS2019)或Visual Studio Code (VSCODE),必要时部署c#开发环境。获得VS2019的帮助:Get Start With Visual Studio。获得VSCODE帮助:Document for Visual Studio Code。关于如何用c#编程:Learn to code in C#。学习使用.net技术实现WebAPI程序:Link to microsoft document。
  3. 下载此项目的压缩文件并解压缩该文件。在./Code/XPDERL.sln找到解决方案文件。在VS2019或VSCODE中打开它。
  4. 保持网络连接,等待自动解析并下载所有必要的相关文件。
  5. 启动调试,并按照开始页的引导测试算法。

运行和测试

为了帮助那些不熟悉c#的人快速评估PDERL和XPDERL的性能,我们提供了在64位Windows上运行的可执行文件。其已包含完整依赖,您只需要以管理员身份双击exe就可以运行它。文件目录在:"./Compiled_file/win_x64/xpderl.exe",或者你可以在这里下载压缩包文件:bin.zip。其运行效果与直接调试代码一样。当通过VS2019调试时,或直接运行exe启动时,测试起始页面的默认url是http://localhost:8000/。理论上你可以在任何浏览器上访问这个地址,但为了获得最佳体验,我们建议你在Edge或Chrome上访问它。

起始页面如下:
在这里插入图片描述

  1. 如果您想在交互式页面中测试PDERL和XPDERL的性能,请单击此链接:
    在这里插入图片描述交互页面如下所示。点击第一个点来设置中心位置,点击第二个点来设置边缘位置,如下所示,您将得到一个蓝色的计算区域。
    在这里插入图片描述边缘点确定后会立即开始计算,计算结果如下所示,中间的绿色区域为可见部分。其他实验可以在右侧的“测试设置”区域进行。但是需要注意的是,与R3算法的精度进行对比实验时,计算范围不能设置得太大,否则计算时间会很长。
    在这里插入图片描述
    需要注意的是,交互测试界面的结果绘制部分代码效率并不高,根据需要绘制区域的大小不同,可能会导致结果显示有一定延迟,这些延迟不是PDERL和XPDERL的计算造成的。我们在设置页的底部给出了算法的计算时间(除绘图结果和网络传输时间外)。如果愿意,您可以在自己的代码中使用更有效的绘图方法替换此部分。

  2. 如果你想使用这个测试程序作为Restful风格的通视分析WebAPI服务,请参考以下部分:
    在这里插入图片描述

  3. 如果您想重复论文《Fast approximate viewshed analysis based on regular grid digital elevation model:X-type partition proximity-direction-elevation spatial reference line algorithm》中的实验部分,请参考下图区域的内容。实验结果会以CSV文件的形式保存在“./RunningLog/”中。点击链接只是启动了实验,必须等待实验完成后才能实现评估。请关注CSV报表文件的大小是否继续增长,当它停止生长时,表明实验结束。由于计算量巨大,这些实验非常耗时,具体耗时长短与计算机的性能有关,但通常会超过6小时。
    在这里插入图片描述

代码简介

修改端口

这是一个web应用程序,如果要修改web端口,请在文件./Code/XPDERL/Program.cs中找到UseUrls(…),在函数中可以修改它(默认是8000端口):

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>WebHost.CreateDefaultBuilder(args).UseUrls("http://*:8000").UseStartup<Startup>();

服务入口

本工程的API服务一般编码在这个代码文件中:./Code/XPDERL/Controllers/DemController.cs; 所有方法都通过GET访问方式。路由规则为"/api/dem/[申明的方法路由]",其中[申明的方法路由]定义在方法特性HttpGet()的参数中。以下列出一些重要的API:

1. 获取DEM数据列表以及当前DEM:

[HttpGet]
public ActionResult<object> Get()
{...
}

返回值是JSON字符串:

{"current":"Copernicus_DSM_COG_10_N28_00_E097_00_DEM","allFiles":["ASTGTM2_N28E097_dem","Copernicus_DSM_COG_10_N28_00_E097_00_DEM",...]
}

2. 设置某DEM为当前计算数据

[HttpGet("setdem/{path}")]
public ActionResult<bool> SetDem(string path)
{...
}

{path}参数是不带后缀名的DEM文件名,比如“Copernicus_DSM_COG_10_N41_00_E119_00_DEM”,这些文件一般放在:./DEM/。您可以在此目录中添加任意TIFF格式的DEM数据,但请不要删除用于实验的现有文件,否则将无法重复论文中的实验。Tiff格式的DEM文件最好采用经纬度坐标记录格网位置,但理论上本程序也支持采用地图投影坐标记录的DEM。如果您的数据是后者,请将随后填写经纬度的参数全部更改为投影坐标。如果您更新了DEM文件,请重新启动程序。

3. PDERL服务:

[HttpGet("analysis_pderl/{lon}/{lat}/{toLon}/{toLat}/{dh}")]
public ActionResult<object> GetAnalysisDefault_Pderl(double lon, double lat, double toLon, double toLat, double dh)
{...
}

{lon}{lat}为观察者站立点的经纬度,{toLon}{toLat}为观测区域边缘某一点的经纬度,{dh}为离地面高度。结果是JSON数据。例如在浏览器中输入http://localhost:8000/api/dem/analysis_pderl/97.5/28.5/97.55/28.53/2并访问,你会得到站在97.5°N, 28.5°E,距地面2m高处观测的,以97.55°N, 28.53°E为边缘点的正方形通视分析结果。 注意,测试的范围不能超过在上一步中设置的DEM文件的地理覆盖范围。 结果如下:

{"visiblePoints":{"hierarchy":[97.44195,28.4419441,97.55806,28.4419441,97.55806,28.5580559,97.44195,28.5580559,97.44195,28.4419441],"values":[[0,0,0,...],[0,1,0,...],[1,1,0,...],...],"x":418,"y":418},"time":"00:00:00.0163397","allCount":174724
}

为了便于阅读,这里省略了一些内容。"hierarchy"是结果的上、下、左、右边缘。
“values”为计算区域内以0和1表示的每个DEM网格点的可见性。0不可见,1可见。
“x”, "y"是结果矩阵的行和列数。
"time"是时间消耗的计算。
"allCount"是计算的DEM网格点总数。

4. XPDERL服务:

[HttpGet("analysis_xpderl/{lon}/{lat}/{toLon}/{toLat}/{dh}")]
public ActionResult<object> GetAnalysisDefault_xPderl(double lon, double lat, double toLon, double toLat, double dh)
{...
}

参数含义和返回值与PDERL相同。

5. 实验1:速度测试(论文原标题:Experiment 1: speed):

[HttpGet("x_analysis_auto_test_time_without_r3")]
public ActionResult<string> X_DoAnalysis_AutoTest_TimeWithoutR3()
{...
}

这将启动实验1,实验1的结果将保存在./RunningLog/中(以CSV文件的形式)。由于计算量巨大,请耐心等待计算完成(大约6小时)。

6. 实验2:精度实验(论文原标题:Experiment 2: accuracy):

[HttpGet("x_analysis_auto_test_accuracy")]
public ActionResult<string> X_DoAnalysis_AutoTest_Accuracy()
{...
}

这将启动实验2,实验2的结果将保存在./RunningLog/中(以CSV文件的形式)。由于计算量巨大,请耐心等待计算完成(大约6小时)。

7. 实验3:错误点聚集程度实验(论文原标题:Experiment 3: aggregation of error points):

[HttpGet("x_analysis_auto_test_neighbor_err")]
public ActionResult<string> X_DoAnalysis_AutoTest_NeighborErr(int p = 0)
{...
}

这将启动实验3,实验3的结果将保存在./RunningLog/中(以CSV文件的形式)。如果参数"p=1"将在Copernicus_DSM_COG_10_N41_00_E119_00_DEM.tiff上测试;"p=2"将在Copernicus_DSM_COG_10_N34_00_E114_00_DEM.tiff上测试;"p=3"将在Copernicus_DSM_COG_10_N28_00_E097_00_DEM.tiff上进行测试。请注意,不同参数的实验不能同时进行。
由于计算量巨大,请耐心等待计算完成(大约6小时)。

PDERL和XPDERL的函数

PDERL和XPDERL的主要功能代码写在"./Code/XPDERL/DemAnalysisHandle.cs"中。

1. PDERL:

public void DoAnalysisByPedrl(double centerX, double centerY, double centerH, double toEndPointX, double toEndPointY, double standH, out int[,] result, out double demMinX, out double demMinY, out double perX, out double perY)
{...
}

"result"矩阵存储分析结果。“demMinX”/“demMinY”是结果左下角点的水平/垂直坐标。“perX”/“perY”是网格的水平/垂直间距。

2. XPDERL:

public void DoAnalysisByXPderl(double centerX, double centerY, double centerH, double toEndPointX, double toEndPointY, double standH, out int[,] result, out double demMinX, out double demMinY, out double perX, out double perY)
{
...
}

参数的含义与PDERL相同。

这篇关于PDERL:基于DEM的快速精确通视域分析算法介绍(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/328714

相关文章

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3