基于WebGIS实现三维定量视域分析

目标

使用java搭建的后端,cesium.js已有的接口来实现视域分析,最起码要实现Arcgis Pro的功能,在其基础上最好可以实现进一步的灵活计算空间体积等其他功能。

启动项目

把前后端框架搭建好,启动服务。

搭建spring boot框架

参考网址:https://blog.csdn.net/bsegebr/article/details/126081107

  1. 新建项目,选择文件夹,项目名称,生成器等等
    在这里插入图片描述
  2. 选择Spring Boot的版本,以及所需依赖项(也可以后面在项目中用到什么加什么)
    在这里插入图片描述

测试启动

  1. 在application.properties配置启动端口
  server.port=8088

在这里插入图片描述
2. 右击com.example.cesiumviewability编写一个控制类controller,注意它的命名规范
在这里插入图片描述

3.在新建的软件包下,新建一个“Hello World”软件类,进行编写
在这里插入图片描述
4. 编写pom依赖项(第一次的时候可能需要右击“maven”重新加载项目)

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

在这里插入图片描述

cesium服务

前端的服务可以在static文件下自己建一个网页内完成,这样一启动8088服务,即可访问index.html。
cesium的js和css都使用在线服务。当然,后面也可以引用本地的cesium的js和css文件。
第二种方法是将网页写在“templates文件夹下,在”HelloWorld.java“文件中去编写访问它。
在这里插入图片描述

准备好研究区域

  1. 删除不必要的控件
var viewer = new Cesium.Viewer('cesiumContainer',{
animation:false, //左下角的动画仪表盘
baseLayerPicker:true, //右上角的图层选择按钮
geocoder:false, //搜索框
homeButton:false, //home按钮
sceneModePicker:false, //模式切换按钮
timeline:false, //底部的时间轴
navigationHelpButton:false, //右上角的帮助按钮,
fullscreenButton:false //右下角的全屏按钮
});
viewer._cesiumWidget._creditContainer.style.display="none"; //删除版权信
  1. 设置好高度,聚焦河海大学江宁校区
//聚焦河海校区,设置高度
let initialPosition = new Cesium.Cartesian3.fromDegrees(118.781,
31.916, 3000);
let homeCameraView = {
destination: initialPosition,
};
viewer.scene.camera.setView(homeCameraView);

在这里插入图片描述
3. 更换默认图层为OSM

//修改默认图层为OSM
viewer.baseLayerPicker.viewModel.selectedImagery=viewer.baseLayerPic
ker.viewModel.imageryProviderViewModels[9];

赋予地形并建模

赋予地形

这个也不知道正不正确,尝试按着步骤去做。参考网址:https://blog.csdn.net/weixin_35782148/article/details/112119825

地形裁剪

具体这个步骤参考大二的“面向实际地理问题的空间建模”的第一次实验报告。
这里注意一点,以往地理配准起码要三点,但因为一些原因,点选多了反而使得影像数据变形。打开“自动校正” 然后选取两个点(距离远一点)效果最好。
在这里插入图片描述

数据转换

将裁剪好的dem数据转换为cesium可以处理的terrain数据。参考文章:

  • https://www.jianshu.com/p/01304a961266
  • https://zhuanlan.zhihu.com/p/40913210
    在这里插入图片描述
    转换的结果:
    在这里插入图片描述

地形数据发布

访问地形数据需要访问服务器数据,一种是在线数据,一种是本地数据发布到本地地址上。前者的在线
数据似乎已失效,而且无法定制。故选择第二种方法。据说QGIS也可以完成切片,可以之后尝试一下。
参考网址:

@CrossOrigin
@SpringBootApplication(scanBasePackages="com.example.cesiumviewability")
@Controller
public class HelloWorld {
@RequestMapping("/Cesium")
public String helloWorld(){
return "Cesium";
}
}

第二种办法是从Tomact 下手,修改其web.xml文件等。
参考这篇博客“Tomcat发布瓦片TMS数据,Cesium加载显示:还是跨域处理”
坑在于,重启服务后,依旧未见效,网页控制台报错“跨域问题”,但其实问题已经解决了。重启电脑即可(不仅仅是重启服务)。
问题的关键可能是需要在“任务管理器”中把Tomact的后台进程(服务)完全关闭。仅仅退出再进入并没有真正的重启Tomact服务

<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filterclass>
<init-param>
<param-name>cors.allowOrigin</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.supportedMethods</param-name>
<param-value>GET, POST, HEAD, PUT, DELETE</param-value>
</init-param>
<init-param>
<param-name>cors.supportedHeaders</param-name>
<param-value>Accept, Origin, X-Requested-With, Content-Type,
Last-Modified</param-value>
</init-param>
<init-param>
<param-name>cors.exposedHeaders</param-name>
<param-value>Set-Cookie</param-value>
</init-param>
<init-param>
<param-name>cors.supportsCredentials</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

渲染结果

重启服务后,可以看到地图已经有了起伏,例如牛首山出,是确实有高度的。并且道路有一定的变形
在这里插入图片描述

其他

上述的所有成果都是在Google浏览器运行的,如果换个浏览器(例如Edge 或者 360) 网页控制台会无端报错“Cesium.Ion.defaultAccessToken”未被定义。解决办法是 把在线的Cesium资源转换为本地。并且本地的资源也可以对冲 在线资源崩溃的风险。

<script src="../Build/Cesium/Cesium.js"></script>
<link href="../Build/Cesium/Widgets/widgets.css" rel="stylesheet">
<!-- <script src="http://localhost:8080/Build/Cesium/Cesium.js"></script>-
->
<!-- <link href="http://localhost:8080/Build/Cesium/Widgets/widgets.css"
rel="stylesheet">-->
<!--在线资源-->
<!-- <script
src="https://cesiumjs.org/releases/1.54/Build/Cesium/Cesium.js"></script>-->
<!-- <link
href="https://cesiumjs.org/releases/1.54/Build/Cesium/Widgets/widgets.css" r

修改完成后 会接着引发另一个错误,就是本地的cesium.js访问在线服务器的时候会出错(404),有一个不停请求而无法获得的endpoint请求。其中一个解决办法是不引用Cesium的在线底图服务。引用其他服务商的(例如ArcGIS)或者自己本地做瓦片地图。

在线资源:http://map.geoq.cn/arcgis/rest/services/

imageryProvider: new Cesium.ArcGisMapServerImageryProvider({
url:"http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetWarm/MapServer"
,
}),//设置默认底图
//修改默认图层
viewer.baseLayerPicker.viewModel.selectedImagery=viewer.baseLayerPicker.viewM
odel.ArcGisMapServerImageryProvider;

在这里插入图片描述
最终还是改成了本地的切片服务

  • 用工具进行切片,将切片结果放在对应的目录下
    在这里插入图片描述
  • 修改代码,让程序的底图引用本地数据
imageryProvider:new Cesium.UrlTemplateImageryProvider({
url:'../OSM/roadmap/{z}/{x}/{y}.png',
fileExtension:"jpg"
}),

建模

这个就更难了,而且参考资料似乎不多。有两种方法,离线在线。尝试使用离线的方法,因为这样更稳定一点。这边参考一些文章尝试去实现。

  1. 赋予白膜后的效果
    在这里插入图片描述

最后

不是要实现三维通视性分析吗? 怎么前面一直在搭建服务?
因为对于初学者来说 搭建服务是最难的,至于如何改进Cesium的PickFromRay算法,实现三维的 定量通视分析 可以去看这篇论文
[1]高超杰,芮小平.基于改进PickFromRay算法的通视性定量分析[J].地理与地理信息科学,2024,40(03):8-13.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值