基于Cesium开源框架的3D展示(包含加载三维以及地图的一些基本操作)_cesuim 加载面3d效果-程序员宅基地

技术标签: cesium  

加载3Dtile模型数据

                                       

3D展示效果
geojson格式数据展示

白驹过隙,时光如梭,又到一年年尾。回想一年的工作,感觉做了很多,又感觉什么都没做成。so,在此回顾一下今年经历过的那些个不一定有头,不一定有尾的项目经历。今天讲讲Cesium。

我是个随性的人,想到哪里讲到哪里,但是逻辑还是很清晰的,细节即是如此。

Cesium是一个很强大的3D框架,很多大公司的底层框架都基于此。so自己实践做了一些实验,对Cesium做了比较详细的了解,并简单实现了测面、测距、加载各种格式的数据(.geojson 3Dtile .kml .czml等格式)。废话不多说,具体了解一下。

首先是Cesium开发包的引入,直接在Cesium的官网上下载就好了,然后新建的项目在项目的Apps里面存放即可。

头部导入.js类

    <!-- script部分 -->
    <script src="../../../Build/Cesium/Cesium.js"></script>

初始化Cesium界面

var viewer = new Cesium.Viewer('map_container', {
        animation: false,
        baseLayerPicker: false,
        geocoder: true,
        timeline: false,
        sceneModePicker: true,
        navigationHelpButton: false,
        infoBox: true,
        fullscreenButton:false,
        vrButton:true,
        homeButton:false,
        selectionIndicator : false,//是否显示选取指示器组件
    });

    viewer._cesiumWidget._creditContainer.style.display = "none";		//去掉左下角那个不可爱的图标

    //    viewer.extend(Cesium.viewerCesiumInspectorMixin);         //那些个特效
    viewer.camera.setView({
        destination:Cesium.Cartesian3.fromDegrees(111.07, 39.05, 20000000),
        orientation:{
            heading : Cesium.Math.toRadians(0),
            pitch : Cesium.Math.toRadians(-90),
            roll : Cesium.Math.toRadians(0)         //heading、pitch和roll就是镜头相对于xyz轴的角度,比如pitch为-90°而另外两个为0时,就是90°向下俯视地球。
        }
    });

new操作的时候,后面{}里面的item都是可选的,改成true or false都可以,都是些特效类,玩腻了,除了必要的,都不要了,例如baselayerPicker底图选择器,里面包含多种数据源(google的啦,bingMap)

加载底图(天地图的,找了好久才找到)

    var layerone = viewer.scene.imageryLayers.addImageryProvider(new Cesium.WebMapTileServiceImageryProvider({
        url: "http://t0.tianditu.com/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles",
        layer: "tdtImgBasicLayer",
        style: "default",
        format: "image/jpeg",
        tileMatrixSetID: "GoogleMapsCompatible",
        show: false
    }));//卫星影像
//    layerone.alpha = 0.3;
//    layerone.brightness = 2.0;
   var layertwo =  viewer.scene.imageryLayers.addImageryProvider(new Cesium.WebMapTileServiceImageryProvider({
        url: "http://t0.tianditu.com/cia_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cia&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles",
        layer: "tdtImgAnnoLayer",
        style: "default",
        format: "image/jpeg",
        tileMatrixSetID: "GoogleMapsCompatible",
        show: false
    }));//注记图层

加载数据,不具体去分开了,因为我自己代码就是写在一起的,来个大集合,.geojson、.KML、tileset.json(3Dtile数据)

3Dtile是什么格式?该知道的总会知道,Cesium加载3Dtile

var URL_MODEL = "/officalCesium/Apps/baseData/";

    $('#upLoadFile').change(function () {
        var file =  $('#upLoadFile').get(0).files[0];
        var filename = file.name;
        var t = filename.lastIndexOf(".");
        var s = filename.substring(t+1,filename.length).toUpperCase();

        var dataType = document.getElementById("typeInput");
        var value = dataType.options[dataType.selectedIndex].value.toUpperCase();

        $('#addLayerModal').modal('hide');          //隐藏对话框

        if(s == value){

            if(value == "GEOJSON"){
                var filepath = URL_MODEL+filename;
                var geosonView = viewer.dataSources.add(Cesium.GeoJsonDataSource.load(filepath,{
                    stroke: Cesium.Color.YELLOW,       //设置为TRANSPARENT的时候,透明
                    fill: Cesium.Color.YELLOW,
                    strokeWidth: 5,
                    markerSymbol: '?',
                }));
                viewer.flyTo(geosonView);
//                alert(filepath+"");
            }

            else if (value == "JSON" && filename.toUpperCase() == "TILESET.JSON"){
                var filepath = URL_MODEL+filename;
                var tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
                    url: filepath,  //数据路径
                    maximumScreenSpaceError: 2,//默认16,最大屏幕空间错误
                                                         //maximumNumberOfLoadedTiles: 1000,
                    maximumMemoryUsage:1024//默认512,内存MB的最大数量
                }));
                    viewer.flyTo(tileset);
//                alert(filepath+"");
            }
            else if(value == "KML"){
                var filepath = URL_MODEL+filename;
                var kml_view = Cesium.KmlDataSource.load(filepath);
                viewer.flyTo(kml_view);
//                alert(filepath+"");
            }else if(value == "CZML"){
                var filepath = URL_MODEL+filename;
              var dataRecourse = new Cesium.CzmlDataSource(filepath);
              dataRecourse.load();
              viewer.dataSources.add(dataRecourse);
              viewer.flyTo(data_resouce);
            }
        }else {
            alert("上传失败,不是."+value+"类型的文件");
        }
    });

飞行、复位等实用工具如下:

//飞行到某个点
    function dingwei(lon,lat,height){
        viewer.camera.flyTo({
            destination :  Cesium.Cartesian3.fromDegrees(lon,lat,height), // 设置位置
            orientation: {
                heading : Cesium.Math.toRadians(20.0), // 方向
                pitch : Cesium.Math.toRadians(-90.0),// 倾斜角度
                roll : 0
            },
            duration:5, // 设置飞行持续时间,默认会根据距离来计算
            complete: function () {
                // 到达位置后执行的回调函数
                console.log('到达目的地');
            },
            cancle: function () {
                // 如果取消飞行则会调用此函数
                console.log('飞行取消')
            },
            pitchAdjustHeight: -90, // 如果摄像机飞越高于该值,则调整俯仰俯仰的俯仰角度,并将地球保持在视口中。
            maximumHeight:500, // 相机最大飞行高度
            flyOverLongitude: 100, // 如果到达目的地有2种方式,设置具体值后会强制选择方向飞过这个经度
        });

    }
    //复位地图
    function clearMap(){
//    	 dingwei(115.446105254,22.771558650,2000);
        viewer.flyTo(tileset);
        clearAllPan();
    }
    //清空地图
    function clearAll(){
        clearAllPan();
    }

然后就是测距测面,测量分两种吧,一直贴地的,一种是3D的那种,贴地量算没问题,3D的我写的代码还是有问题。

    //* 测距测面  */

    var scene = viewer.scene;
    var canvas = viewer.canvas;
    var clock = viewer.clock;
    var camera = viewer.scene.camera;

    //布尔型变量
    var isPoint = false;
    var isPolyline = false;
    var isPolygon_line = false;

    //是否开始绘制标识
    var isStartDraw = false;
    var isclear = false;
    var points = viewer.entities.add(new Cesium.Entity());
    var polylines = viewer.entities.add(new Cesium.Entity());
    var Polygons_Line = viewer.entities.add(new Cesium.Entity());

    //画多边形过程中展示的线最后要移除或者不显示
    var Polygon_Lines_remove = viewer.entities.add(new Cesium.Entity());

    var ellipsoid = scene.globe.ellipsoid;
    canvas.onclick = function () {
        canvas.focus();
    };
    var handler = new Cesium.ScreenSpaceEventHandler(canvas);
    viewer.zoomTo(viewer.entities);

    defaultZoomAmount_ = 3000000.0;
    var lastPointLon = -999.0;
    var lastPointLat = -999.0;


    var firstPointLon = -999.0;
    var firstPointLat = -999.0;


    var measurePointsArray=new Array();
    measurePointsArray.splice(0,measurePointsArray.length);
    var endCartographic = new Cesium.Cartographic();
    var geodesic = new Cesium.EllipsoidGeodesic();
    var PolygonPointArray_line = null;
    var PolygonPointArray_fill = null;
    //鼠标移动时的那条线
    var moveLine_first = viewer.entities.add({
        id: "moveLine_first",
        name: 'line on the surface',
        polyline: {
            show: false,
            width: 2,
            material: Cesium.Color.WHITE
        }
    });

    var moveLine_second = viewer.entities.add({
        id: "moveLine_second",
        name: 'line on the surface',
        polyline: {
            show: false,
            width: 2,
            material: Cesium.Color.WHITE
        }
    });


    /*    handler.setInputAction(function(){},
            Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);*/
    //鼠标移动时做的操作
    handler.setInputAction(function (movement) {
      

        //捕获椭球体,将笛卡尔二维平面坐标转为椭球体的笛卡尔三维坐标,返回球体表面的点
        var cartesian=viewer.camera.pickEllipsoid(movement.endPosition, ellipsoid);
        if(cartesian) {
            //将笛卡尔三维坐标转为地图坐标(弧度)
            var cartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
            //将地图坐标(弧度)转为十进制的度数
            var lat_String = Cesium.Math.toDegrees(cartographic.latitude).toFixed(4);
            var log_String = Cesium.Math.toDegrees(cartographic.longitude).toFixed(4);
            var alti_String = (viewer.camera.positionCartographic.height / 1000).toFixed(2);
            longitude_show.innerHTML = log_String;
            latitude_show.innerHTML = lat_String;
            altitude_show.innerHTML = alti_String;
        }
    }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);



    function clearAllPan() {
        viewer.entities.removeAll();
        isStartDraw = false;
        isclear = true;
        document.body.style.cursor = "pointer";
        document.getElementById("map_container").style.cursor = "pointer";
        handler.setInputAction(function(){
        },Cesium.ScreenSpaceEventType.LEFT_CLICK);
    }

    var QQ=0;

    function clearAllPan1(id) {
        if(id!=undefined){
            var tempmark = viewer.entities.getById(id);
            viewer.entities.remove(tempmark);
        }
        QQ=1;
    }

    //双击停止加线面
    function shuangji(){
        isPolyline = false;
        isPolygon_line = false;
        isPolygon_fill = false;
        isStartDraw = false;

    }

    //加点
    function addPoint() {
        isPoint = true;
        isPolyline = false;
        isPolygon_line = false;
        isPolygon_fill = false;
        isStartDraw = false;
        QQ=0;
    }

    //加线
    function measureLength() {
        var select_measure = document.getElementById("selOpt");
        var value_measure = select_measure.options[select_measure.selectedIndex].value;
        if(value_measure == 2){
            isPoint = false;
            isPolyline = true;
            isPolygon_line = false;
            isPolygon_fill = false;
            isStartDraw = false;
            QQ=0;
            document.body.style.cursor = "url(resource/pic/icons/magnifier3.cur) 12 12,crosshair";
            document.getElementById("map_container").style.cursor = "url(resource/pic/icons/magnifier3.cur) 12 12,crosshair";
            addOnClickListener();
        }

    }

    function addOnClickListener(){

        handler.setInputAction(function(){},
            Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
        //鼠标移动时做的操作
        handler.setInputAction(function (movement) {
            if (isPolyline || isPolygon_line ) {
                var cartesian = viewer.camera.pickEllipsoid(movement.endPosition, scene.globe.ellipsoid);
                if (cartesian && isStartDraw) {
                    //做清除工作把全局变量moveLine清除掉了 ,需要重新加到entities上 否则显示不正常
                    if (isclear) {
                        viewer.entities.add(moveLine_first);
                        viewer.entities.add(moveLine_second);
                        isclear = false;
                    }
                    var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
                    var curMovementLon = Cesium.Math.toDegrees(cartographic.longitude).toFixed(12);
                    var curMovementLat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(12);

                    viewer.entities.getById("moveLine_first").polyline.positions = Cesium.Cartesian3.fromDegreesArray([lastPointLon, lastPointLat ,curMovementLon,
                        curMovementLat]);//修改属性
                    viewer.entities.getById("moveLine_first").polyline.show = true;
                    if (PolygonPointArray_line != null) {
                        if (PolygonPointArray_line.length >= 3) {
                            viewer.entities.getById("moveLine_second").polyline.positions = Cesium.Cartesian3.fromDegreesArray([curMovementLon, curMovementLat, firstPointLon, firstPointLat]);//修改属性
                            viewer.entities.getById("moveLine_second").polyline.show = true;
                        }
                    }
                }
            }
            //捕获椭球体,将笛卡尔二维平面坐标转为椭球体的笛卡尔三维坐标,返回球体表面的点
            var cartesian=viewer.camera.pickEllipsoid(movement.endPosition, ellipsoid);
            if(cartesian){
                //将笛卡尔三维坐标转为地图坐标(弧度)
                var cartographic=viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
                //将地图坐标(弧度)转为十进制的度数
                var lat_String=Cesium.Math.toDegrees(cartographic.latitude).toFixed(4);
                var log_String=Cesium.Math.toDegrees(cartographic.longitude).toFixed(4);
                var alti_String=(viewer.camera.positionCartographic.height/1000).toFixed(2);
                longitude_show.innerHTML=log_String;
                latitude_show.innerHTML=lat_String;
                altitude_show.innerHTML=alti_String;
            }
        }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);


        //鼠标左击做的操作
        handler.setInputAction(function (click) {
            if(QQ==1){
                var pickedObject = viewer.scene.pick(click.position);

                if (Cesium.defined(pickedObject) && (pickedObject.id != undefined)) {
                    actEntity = pickedObject.id;
                    clearAllPan1(actEntity._id);
                }

            }

            if (isPoint || isPolyline || isPolygon_line ) {
                var cartesian = viewer.camera.pickEllipsoid(click.position, scene.globe.ellipsoid);
                if (cartesian) {
                    var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
                    var currentClickLon = Cesium.Math.toDegrees(cartographic.longitude).toFixed(12);
                    var currentClickLat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(12);


                    /*   var currentClickHeight = cartographic.height;
                      console.log(currentClickHeight); */

                    if (!isStartDraw) {
                        viewer.entities.add({
                            position: cartesian,
                            point: {
                                parent: points,
                                pixelSize: 5,
                                color: Cesium.Color.YELLOW
                            }
                        });
                        firstPointLon = currentClickLon;
                        firstPointLat = currentClickLat;

                        PolygonPointArray_line = null;
                        PolygonPointArray_fill = null;
                        measurePointsArray.splice(0,measurePointsArray.length);
//                        var startCartographic = Cesium.Cartographic.fromDegrees(firstPointLon, firstPointLat);
                        measurePointsArray.push(cartographic);
                        isStartDraw = true;
                    } else {
                        if (isPoint) {
                            viewer.entities.add({
                                position: cartesian,
                                point: {
                                    parent: points,
                                    pixelSize: 5,
                                    color: Cesium.Color.YELLOW
                                }
                            });
                        }
                        if (isPolyline || isPolygon_line )
                        {
                            //                       endCartographic = Cesium.Cartographic.fromDegrees(currentClickLon, currentClickLat,currentClickHigh);
                            endCartographic = Cesium.Cartographic.fromDegrees(currentClickLon, currentClickLat);
                            console.log(endCartographic);
                            measurePointsArray.push(endCartographic);
                            var arrLength=measurePointsArray.length;
                            var tmpDis=0;
                            var sumDis=0;
                            for(var i=1;i<arrLength;i++)
                            {
                                geodesic.setEndPoints(measurePointsArray[i-1], measurePointsArray[i]);
                                tmpDis=Math.round(geodesic.surfaceDistance);
                                sumDis=sumDis+tmpDis;
                            }
                            if(sumDis>1000)
                            {
                                var polylineDis= (sumDis / 1000).toFixed(1) + " km";
                            }
                            else{
                                var polylineDis= sumDis + " m";
                            }
                            //  console.log(dis);
                            viewer.entities.add({
                                parent: polylines,
                                polyline: {
                                    //                               positions: Cesium.Cartesian3.fromDegreesArray([lastPointLon, lastPointLat,lastPointHigh, currentClickLon, currentClickLat,currentClickHigh]),
                                    positions: Cesium.Cartesian3.fromDegreesArray([lastPointLon, lastPointLat, currentClickLon, currentClickLat]),
                                    width: 2,
                                    material: Cesium.Color.RED
                                },
                                label: {
                                    text: polylineDis.toString(),
                                    font: '20px SimHei ',
                                    Width: 10,
                                    style: Cesium.LabelStyle.FILL_AND_OUTLINE,
                                    fillColor: Cesium.Color.YELLOW,
                                    outlineColor : Cesium.Color.GRAY,
                                    outlineWidth :5,
                                    horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
                                    verticalOrigin: Cesium.VerticalOrigin.BOTTOM
                                },
                                /*  label : {
                                      // This callback updates the length to print each frame.
                                      text: polylineDis.toString(),
                                      font : '25px',
                                      pixelOffset : new Cesium.Cartesian2(1, 20)
                                  },*/
//                            position: Cesium.Cartesian3.fromDegrees(currentClickLon, currentClickLat,currentClickHigh)
                                position: Cesium.Cartesian3.fromDegrees(currentClickLon, currentClickLat)
                            });
                            viewer.entities.getById("moveLine_first").polyline.show = false;
                            viewer.entities.getById("moveLine_second").polyline.show = false;
                        }
                    }
                    //记录鼠标点击的当前位置 作为下一次画线的起始点位置
                    lastPointLon = currentClickLon;
                    lastPointLat = currentClickLat;
//				lastPointHigh = currentClickHigh;

                    if (isPolygon_line) {
                        if (PolygonPointArray_line == null)
                            PolygonPointArray_line = new Array();
                        PolygonPointArray_line.push(currentClickLon);
                        PolygonPointArray_line.push(currentClickLat);
//                    PolygonPointArray_line.push(currentClickHigh);
                    }
                }
            }
        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

        //鼠标双击时做的操作
        handler.setInputAction(function (click)
        {

            if (isPolyline || isPolygon_line )
            {
                var cartesian = viewer.camera.pickEllipsoid(click.position, scene.globe.ellipsoid);
                if (cartesian && isStartDraw)
                {
                    var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
                    var endPointLon = Cesium.Math.toDegrees(cartographic.longitude).toFixed(12);
                    var endPointLat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(12);
                    var endPointHigh = Cesium.Math.toDegrees(cartographic.height).toFixed(12);

                    measurePointsArray.push(cartographic);
                    var arrLength=measurePointsArray.length;
                    var tmpDis=0;
                    var sumDis=0;
                    for(var i=1;i<arrLength;i++)
                    {
                        geodesic.setEndPoints(measurePointsArray[i-1], measurePointsArray[i]);
                        tmpDis=Math.round(geodesic.surfaceDistance);
                        sumDis=sumDis+tmpDis;
                    }
                    //考虑多边形最后显示距离
                    geodesic.setEndPoints(measurePointsArray[0], measurePointsArray[arrLength-1]);
                    tmpDis=Math.round(geodesic.surfaceDistance);
                    sumDis1=sumDis+tmpDis;

                    if(sumDis>1000)
                    {
                        var polylineDis= (sumDis / 1000).toFixed(1) + " km";
                        var polygonDis = (sumDis1 / 1000).toFixed(1) + " km";
                    }
                    else{
                        var polylineDis= (sumDis) + " m";
                        var polygonDis = (sumDis1) + " m";
                    }


                    if (isPolyline || isPolygon_line )
                    {
                        //画末线段
                        viewer.entities.add({
                            name: 'line on the surface',
                            parent: polylines,
                            polyline: {
                                positions: Cesium.Cartesian3.fromDegreesArray([lastPointLon, lastPointLat, endPointLon, endPointLat]),
                                width: 5,
                                material: Cesium.Color.RED
                            },
                            label: {
                                text: polylineDis.toString(),
                                font: '20px SimHei ',
                                Width: 10,
                                style: Cesium.LabelStyle.FILL_AND_OUTLINE,
                                fillColor: Cesium.Color.YELLOW,
                                outlineColor : Cesium.Color.GRAY,
                                outlineWidth :5,
                                horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
                                verticalOrigin: Cesium.VerticalOrigin.BOTTOM
                            },
                            /*label : {
                                // This callback updates the length to print each frame.
                                text: polylineDis.toString(),
                                font : '25px',
                                pixelOffset : new Cesium.Cartesian2(1, 20)
                            },*/
                            position: Cesium.Cartesian3.fromDegrees(endPointLon, endPointLat)
                        });
                        if ( isPolygon_line )
                        {
                            viewer.entities.add({
                                name: 'line on the surface',
                                parent: polylines,
                                polyline: {
                                    positions: Cesium.Cartesian3.fromDegreesArray([endPointLon, endPointLat, firstPointLon, firstPointLat]),
                                    width: 5,

                                    material: Cesium.Color.RED
                                }
                            });
                            viewer.entities.getById("moveLine_second").polyline.show = false;
                        }
                        viewer.entities.getById("moveLine_first").polyline.show = false;
                    }
                    //画多边形 不带填充
                    if (isPolygon_line)
                    {
                        if (PolygonPointArray_line != null) {
                            PolygonPointArray_line.push(endPointLon);
                            PolygonPointArray_line.push(endPointLat);
                        }
                        //当多边形数组中点的个数大于等于3时添加多边形
                        if (PolygonPointArray_line.length >= 3) {
                            viewer.entities.add({
                                name: 'polygon on surface',
                                polygon: {
                                    hierarchy: Cesium.Cartesian3.fromDegreesArray(PolygonPointArray_line),
                                    material: Cesium.Color.RED,
                                    fill: false,  //不显示填充
                                    outline: true,
                                    outlineWidth: 5.0,
                                    outlineColor: Cesium.Color.RED
                                },
                                label: {
                                    text: polygonDis.toString(),
                                    font: '20px SimHei ',
                                    Width: 10,
                                    style: Cesium.LabelStyle.FILL_AND_OUTLINE,
                                    fillColor: Cesium.Color.YELLOW,
                                    outlineColor : Cesium.Color.GRAY,
                                    outlineWidth :5,
                                    horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
                                    verticalOrigin: Cesium.VerticalOrigin.BOTTOM
                                },
                                /*  label : {
                                      // This callback updates the length to print each frame.
                                      text: polygonDis.toString(),
                                      font : '25px',
                                      pixelOffset : new Cesium.Cartesian2(1, 1)
                                  },*/
                                position: Cesium.Cartesian3.fromDegrees(firstPointLon, firstPointLat)
                            });
                        }
                        PolygonPointArray_line = null;
                        viewer.entities.getById("moveLine_first").polyline.show = false;
                        viewer.entities.getById("moveLine_second").polyline.show = false;
                    }
                    isStartDraw = false;
                }
            }
        }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
    }


    //加多边形不带填充
    function measureArea() {
        var select_measure = document.getElementById("selOpt");
        var value_measure = select_measure.options[select_measure.selectedIndex].value;
        if(value_measure == 2){
            isPoint = false;
            isPolyline = false;
            isPolygon_line = true;
            isPolygon_fill = false;
            isStartDraw = false;
            QQ=0;
            document.body.style.cursor = "url(resource/pic/icons/magnifier3.cur) 12 12,crosshair";
            document.getElementById("map_container").style.cursor = "url(resource/pic/icons/magnifier3.cur) 12 12,crosshair";
            addOnClickListener();
        }

    }

唔,大概主要功能就是这些了。给自己备忘,代码包我就不传了,如果有问题或者想了解更多的童鞋可以私信或者微我 ^V^

GeoJson格式的国界线数据展示

 

测量

Life is like a box of chocolate,you never know what you're gonna get next.

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Enbir/article/details/85088647

智能推荐

什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?_成员内部类和局部内部类的区别-程序员宅基地

文章浏览阅读3.4k次,点赞8次,收藏42次。一、什么是内部类?or 内部类的概念内部类是定义在另一个类中的类;下面类TestB是类TestA的内部类。即内部类对象引用了实例化该内部对象的外围类对象。public class TestA{ class TestB {}}二、 为什么需要内部类?or 内部类有什么作用?1、 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。2、内部类可以对同一个包中的其他类隐藏起来。3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。三、 内部类的分类成员内部_成员内部类和局部内部类的区别

分布式系统_分布式系统运维工具-程序员宅基地

文章浏览阅读118次。分布式系统要求拆分分布式思想的实质搭配要求分布式系统要求按照某些特定的规则将项目进行拆分。如果将一个项目的所有模板功能都写到一起,当某个模块出现问题时将直接导致整个服务器出现问题。拆分按照业务拆分为不同的服务器,有效的降低系统架构的耦合性在业务拆分的基础上可按照代码层级进行拆分(view、controller、service、pojo)分布式思想的实质分布式思想的实质是为了系统的..._分布式系统运维工具

用Exce分析l数据极简入门_exce l趋势分析数据量-程序员宅基地

文章浏览阅读174次。1.数据源准备2.数据处理step1:数据表处理应用函数:①VLOOKUP函数; ② CONCATENATE函数终表:step2:数据透视表统计分析(1) 透视表汇总不同渠道用户数, 金额(2)透视表汇总不同日期购买用户数,金额(3)透视表汇总不同用户购买订单数,金额step3:讲第二步结果可视化, 比如, 柱形图(1)不同渠道用户数, 金额(2)不同日期..._exce l趋势分析数据量

宁盾堡垒机双因素认证方案_horizon宁盾双因素配置-程序员宅基地

文章浏览阅读3.3k次。堡垒机可以为企业实现服务器、网络设备、数据库、安全设备等的集中管控和安全可靠运行,帮助IT运维人员提高工作效率。通俗来说,就是用来控制哪些人可以登录哪些资产(事先防范和事中控制),以及录像记录登录资产后做了什么事情(事后溯源)。由于堡垒机内部保存着企业所有的设备资产和权限关系,是企业内部信息安全的重要一环。但目前出现的以下问题产生了很大安全隐患:密码设置过于简单,容易被暴力破解;为方便记忆,设置统一的密码,一旦单点被破,极易引发全面危机。在单一的静态密码验证机制下,登录密码是堡垒机安全的唯一_horizon宁盾双因素配置

谷歌浏览器安装(Win、Linux、离线安装)_chrome linux debian离线安装依赖-程序员宅基地

文章浏览阅读7.7k次,点赞4次,收藏16次。Chrome作为一款挺不错的浏览器,其有着诸多的优良特性,并且支持跨平台。其支持(Windows、Linux、Mac OS X、BSD、Android),在绝大多数情况下,其的安装都很简单,但有时会由于网络原因,无法安装,所以在这里总结下Chrome的安装。Windows下的安装:在线安装:离线安装:Linux下的安装:在线安装:离线安装:..._chrome linux debian离线安装依赖

烤仔TVの尚书房 | 逃离北上广?不如押宝越南“北上广”-程序员宅基地

文章浏览阅读153次。中国发达城市榜单每天都在刷新,但无非是北上广轮流坐庄。北京拥有最顶尖的文化资源,上海是“摩登”的国际化大都市,广州是活力四射的千年商都。GDP和发展潜力是衡量城市的数字指...

随便推点

java spark的使用和配置_使用java调用spark注册进去的程序-程序员宅基地

文章浏览阅读3.3k次。前言spark在java使用比较少,多是scala的用法,我这里介绍一下我在项目中使用的代码配置详细算法的使用请点击我主页列表查看版本jar版本说明spark3.0.1scala2.12这个版本注意和spark版本对应,只是为了引jar包springboot版本2.3.2.RELEASEmaven<!-- spark --> <dependency> <gro_使用java调用spark注册进去的程序

汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用_uds协议栈 源代码-程序员宅基地

文章浏览阅读4.8k次。汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用,代码精简高效,大厂出品有量产保证。:139800617636213023darcy169_uds协议栈 源代码

AUTOSAR基础篇之OS(下)_autosar 定义了 5 种多核支持类型-程序员宅基地

文章浏览阅读4.6k次,点赞20次,收藏148次。AUTOSAR基础篇之OS(下)前言首先,请问大家几个小小的问题,你清楚:你知道多核OS在什么场景下使用吗?多核系统OS又是如何协同启动或者关闭的呢?AUTOSAR OS存在哪些功能安全等方面的要求呢?多核OS之间的启动关闭与单核相比又存在哪些异同呢?。。。。。。今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCXrdI0k-1636287756923)(https://gite_autosar 定义了 5 种多核支持类型

VS报错无法打开自己写的头文件_vs2013打不开自己定义的头文件-程序员宅基地

文章浏览阅读2.2k次,点赞6次,收藏14次。原因:自己写的头文件没有被加入到方案的包含目录中去,无法被检索到,也就无法打开。将自己写的头文件都放入header files。然后在VS界面上,右键方案名,点击属性。将自己头文件夹的目录添加进去。_vs2013打不开自己定义的头文件

【Redis】Redis基础命令集详解_redis命令-程序员宅基地

文章浏览阅读3.3w次,点赞80次,收藏342次。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。当数据量很大时,count 的数量的指定可能会不起作用,Redis 会自动调整每次的遍历数目。_redis命令

URP渲染管线简介-程序员宅基地

文章浏览阅读449次,点赞3次,收藏3次。URP的设计目标是在保持高性能的同时,提供更多的渲染功能和自定义选项。与普通项目相比,会多出Presets文件夹,里面包含着一些设置,包括本色,声音,法线,贴图等设置。全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,主光源和附加光源在一次Pass中可以一起着色。URP:全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,一次Pass可以计算多个光源。可编程渲染管线:渲染策略是可以供程序员定制的,可以定制的有:光照计算和光源,深度测试,摄像机光照烘焙,后期处理策略等等。_urp渲染管线