• 超图GIS入门iserver搭建,前端调用iserver加载三维场景demo


    前言

    前段时间因为对3D制图感兴趣,学习了一下国内制作GIS的公司产品技术,并以一个demo为示例演示
    从制作一个三维场景地图——>安装iserver服务——>发布制作的地图——>最后通过前端加载地图显示操作等
    分为几个步骤来逐步讲解。

    GIS介绍,为什么选择它?

    iserver安装和接口调用

    制作一个简单的demo

    一.GIS介绍,为什么选择它?

    超图是全球第三大、亚洲最大的地理信息系统(GIS)软件厂商,主要从事地理信息系统相关软件技术研发与应用服务。
    为什么选它?因为它是国产了,上手比较简单,因为是中文的,我也不用去找其它国外的破解版。省心、省力、省时、省钱
    图片1e8105f7b56f3c5c32dfe081ad888edc9

    正所谓没有最牛的语言、框架。直接抛开外在客观因素、外在条件去聊方案都是耍流氓。

    二.环境安装

    我用的是安装在本地的服务,一套服务都可以用超图的进行搭建,它的功能还是挺多的,还处于慢慢完善的阶段。
    首先打开超图的技术资源中心http://support.supermap.com.cn/DownloadCenter/ProductPlatform.aspx
    找到云GIS服务,选择 SuperMap iServer 10i(2021)

    图片2e003fcc2d8eaaf381b8a8619bcdb38a1

    下载该服务包,版本建议下载V10.1.2以上版本,老版本毛病太多了。电脑系统和安装包格式根据个人需求进行下载,我配置的是本地的,所以下载的是windowns版本64位V10.1.2 的zip格式压缩包

    图片3152a76055a009562a25cbfdd080ca97b

    下载解压后,打开文件夹找到“bin”目录下的“startup.bat”启动程序,启动服务

    图片4d14939c40fbea994919de0e9b7fad329

    我们跳过一直点击下一步的繁琐步骤和等待,快进到最后
    SuperMap iServer默认的端口为:8090,服务器启动后,会自动发布默认的示例服务。
    通过http://:/iserver即可访问SuperMap iServer服务的首页。
    本地访问http://localhost:8090即可打开页面,如下图:

    图片5b7bcedf9a88bac583948ae6c0b12bf64

    输入账号密码配置用户这些应该都会,不用详细说了;接着我们查看系统环境,全部为绿色直接下一步就行了

    图片61276f1e29f431ac3338f7cfb1a6f1330

    在进入创建账户的第三步之前,许可驱动需要安装一下;从开始菜单进入许可中心;
    第一次进入会出现下图提示;

    图片7fc80bdfd6231abf7e6b91a824b9f5e6d

    点击“是”就行了,它会自动安装一个
    如果无法自动安装,则需要返回网页手动下载一个许可中心,解压后点击安装即可

    图片832fbcd34fe84f8851593737a40017978

    图片93e8106868a21a7b0020409e48e4bba7f

    临时许可为90天试用期,过期需要去网站申请更新即可

    图片103cdab0f80017d9d2cb194108425f6379

    图片117d301217daa478b9ecbf98074e74850b

    显示配置完成,我们的iserver服务就已经搭建成功了,可以进入主界面了

    图片12edad0a51f46507076ed73c6e8fc887d2

    图片132cb4a84dab32c65f13e35b10cbeedb76

    选择一个服务接口点进去,到里面查看该接口数据的其它内容,有很多种方式供调用,选择自己开发适合的调用即可,像xml,json,HTML等等

    图片14ce9d29c565fa39ff1f77a58c6468aff3

    三.调用三维GIS场景

    首先我们先发布一个已制作好的三维场景(制作地图需要用到其它软件制作,这个我们后面再讲,大家可以用iserver中一些自带的场景进行调用,也可以的)

    图片156168f80b4b1628f67a2f88e033d36c0e

    图片16f0bfa4d00705145864df059600169beb

    这里我们先用自带的一个服务进行制作

    图片17f5b0d4a6f1414d0dac2136d3f95d89bf

    首先我们打开VS或者其它前端软件,建议HTML页面
    (关于 SuperMap iClient3D for WebGL,大家不想自己麻烦建一个3D的js配置文件,我建议去http://support.supermap.com.cn:8090/webgl/web/index.html 官网去下载一个它已有的资源包,后续根据自己需要再做调整)

    这里我们下载一个资源包,打开资源包,在webgl目录下新建我们的HTML页面

    图片18d92bba3602b5fdf865886d2338c66399

    在examples文件夹下新建HTML文件, 在文件中通过 script 标签将Cesium.js文件引入

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <script type="text/javascript" src="../Build/Cesium/Cesium.js"></script>
    </head>
    </html>
    

    同时应该根据需要在 head 标签中引入SuperMap iClient3D for WebGL的其他css文件和js文件,如下:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
        <link href="../Build/Cesium/Widgets/widgets.css" rel="stylesheet">
        <link href="./css/pretty.css" rel="stylesheet">
        <script src="./js/jquery.min.js"></script>
        <script src="./js/config.js"></script>
        <script type="text/javascript" src="../Build/Cesium/Cesium.js"></script>
    </head>
    </html>
    

    !17 初始化三维地球!

    <script type="text/javascript">
        function onload(Cesium) {
            var viewer = new Cesium.Viewer('CesiumContainer');
        }
    </script>
    

    设置地图风格

    默认风格是Cesium自带的,这里我们使用我们本地的图片进行设置

    <script type="text/javascript">
        function onload(Cesium) {
                var viewer = new Cesium.Viewer('cesiumContainer');
                  //使用本地的一张图片初始化地球,建议图片长宽比2:1
                    viewer.imageryLayers.addImageryProvider(new Cesium.SingleTileImageryProvider({
                    url :  './images/DemoImage.jpg'
                }));
    </script>
    

    !17 颜色设置 !

    SuperMap iClient3D for WebGL支持对场景的颜色进行设置:
    viewer.scene.colorCorrection.show = true;
    viewer.scene.colorCorrection.saturation = $("#saturation").val();
    viewer.scene.colorCorrection.brightness = $("#brightness").val();
    viewer.scene.colorCorrection.contrast = $("#contrast").val();
    viewer.scene.colorCorrection.hue = $("#hue").val();
        //颜色校正开关
    $("#colorCorrectionShow").on("input change", function() {
    viewer.scene.colorCorrection.show = this.checked;
    });
        //调节饱和度
    $("#saturation").on("input change", function() {
    viewer.scene.colorCorrection.saturation = this.value;
    });
        //调节亮度
    $("#brightness").on("input change", function() {
    viewer.scene.colorCorrection.brightness = this.value;
    });
        //调节对比度
    $("#contrast").on("input change", function() {
    viewer.scene.colorCorrection.contrast = this.value;
    });
        //调节色调
    $("#hue").on("input change", function() {
    viewer.scene.colorCorrection.hue = this.value;
    });
    

    结果加载出一个球,emmm

    图片1918864f4b1c73b220f27a49a72cc2d57f

    添加地图iServer服务

    对于在 iServer上发布的S3M地图服务,可以通过以下两种方式打开。分别是addS3MTilesLayerByScp接口和open接口
    1.addS3MTilesLayerByScp接口的优势是,可以根据自己的需要选择部分图层添加到场景中,提高加载性能,但需要加载多图层的整个场景时,不如scene.open方便。
    2.这里我们采用最简单易操作且不易出现遗漏图层的接口方式,通过open接口将整个场景打开

    <script type="text/javascript">
    var viewer = new Cesium.Viewer('cesiumContainer');
    var scene = viewer.scene
        var promise = scene.open
    ('http://localhost:8090/iserver/services/3D-SctScene-8/rest/realspace');
        Cesium.when(promise, function (layers) {
            //设置相机位置、视角,便于观察场景
            scene.camera.setView({
                destination: new Cesium.Cartesian3.fromDegrees(113.93930368774213, 22.558551546996856, 500.79457371673558),
                orientation: {
                    heading: 5,
                    pitch: -1.5188,
                    roll: 6.283185307179563
                }
            });
        
        })
    if (typeof Cesium !== 'undefined') {
        window.startupCalled = true;
        onload(Cesium);
    }
    

    图片20d8dd53718f75a10dbf23a017948c4b2f

    三维场景加载出来了。注意的是由于我是用自己电脑做的,所以接口地址是localhost,如果服务在其它电脑上,尽量用IP地址。
    下图为场景的操作轮盘,360*旋转视角,180度翻转,放大缩小

    图片21708f5093f91884ce8fc510b58e957ff6

    然后就是关于加载三维GIS场景后,怎么操作,这就比较简单了

    这里我们在加入一个空间查询的设置,便于后面的信息操作,用于定位
    这个作用就像你打LOL在地上乱点时,英雄就会走到你指定的位置,一个经纬度值,配合路网集就可以进化为类似一个自动导航行走的功能

    var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
     
        //设置鼠标左键单击回调事件
        handler.setInputAction(function(e) {
            //首先移除之前添加的点
            viewer.entities.removeAll();
            //获取点击位置笛卡尔坐标
            var position = scene.pickPosition(e.position);
     
            //将笛卡尔坐标转化为经纬度坐标
            var cartographic = Cesium.Cartographic.fromCartesian(position);
            var longitude = Cesium.Math.toDegrees(cartographic.longitude);
            var latitude = Cesium.Math.toDegrees(cartographic.latitude);
            var height = cartographic.height;
            if(height < 0) {
                height = 0;
            }
     
            //创建弹出框信息,即时查看获取的位置信息
            var entity = new Cesium.Entity({
                name : "位置信息",
                description : createDescription(Cesium, [longitude, latitude, height])
            });
            viewer.selectedEntity = entity;
     
            //为更直观地展示查询的位置,在点击处添加对应点
            viewer.entities.add(new Cesium.Entity({
                point : new Cesium.PointGraphics({
                    color : new Cesium.Color(1, 1, 0),
                    pixelSize : 10,
                    outlineColor : new Cesium.Color(0, 1, 1)
                }),
                position : Cesium.Cartesian3.fromDegrees(longitude, latitude , height + 0.5)
            }));
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
    

    添加完成后,我们还要添加一个物体的属性查询
    作用就是,你打LOL的时候,点击英雄的时候,告诉你英雄的属性值

    //SQL为预留给数据库用

    function doSqlQuery(SQL) {
        var getFeatureParam;
        getFeatureParam = new SuperMap.REST.FilterParameter({
            attributeFilter: SQL //SQL为查询条件
    });
    

    上帝视角:就和你们打LOL/沙盘游戏一样吗,放大缩小,点击建筑物这些都差不多,显示建筑物名称,属性值,经纬度这些也类似

    图片229bd2f28eed7fe22ac1c439bc1a6db0a9

    个人视角:这个相当于你们玩吃鸡的视角感,拉伸拉远,视角转向查看前后左右这些,点击周围树木,房子这些查看地理位置,物品属性值

    图片233336e85b606d96cf6791a7768f3736f9
    图片244b08684bdbe4386f2c63a216c9a166d2

    今天就到这了,等我把这些接口全翻译了再整点新花样

    图片25468d142195db4de6de3c6938a7109867

    后续会继续更新:三维GIS定位导航,测量绘画,数据流模拟显示航线信息,人流量分析

    图片264f2b58cd81be2a87cc168a08eec26409

    福禄·研发中心 空蝉
  • 相关阅读:
    python中函数的定义,调用,全局变量,局部变量,函数的嵌套使用初级篇
    逐行解释和整体解释的理解
    python中函数参数的详解,可变参数,关键字参数等
    python中is和==的区别
    python中的模块,以及包的导入的总结
    Python当中的a += a 与 a = a + a 的区别,可变类型与不可变类型的数据类型,引用传参
    学习Java的第七天
    学习Java的第八天
    学习java的第六天
    学习java第二天
  • 原文地址:https://www.cnblogs.com/fulu/p/15623874.html
Copyright © 2020-2023  润新知