Wechat: yu389741| Email: gisdqy@163.com

Shop:https://www.giserdqy.com/shop

openlayers展示坐标点、连线并实时刷新


//指定地图的位置
<div id="map" class="map"></div>
<script type="text/javascript">
//声明点位信息所需变量
var routeInfos = [];
var routePopups = [];
//声明连线要展示的图层 (图层的添加顺序会用心覆盖效果)
var vector_line;
//声明地图
map = new ol.Map({
    target : 'map',
    view : new ol.View({
        center : ol.proj.transform([105.571776,28.874441],'EPSG:4326', 'EPSG:3857'),
        zoom : 18,
        maxZoom : 19,
        minZoom : 5,
        projection : projection,
    })
});

//为地图添加影像图片
var image_google = new ol.layer.Tile(
        {
            id : 'tianditu',
            title : "影像",
            baseLayer : true,
            source : new ol.source.XYZ(
                    {
                        url: "https://mt" + fRandomBy(0, 3) + ".google.cn/maps/vt?lyrs=s&hl=zh-CN&gl=CN&&x={x}&y={y}&z={z}"
                    }),
            opacity : 1,
        });

map.addLayer(image_google);

//声明展示点位的图层 (图层的添加顺序会影响覆盖效果)

var route_Layer = new ol.layer.Vector({
    id : 'rr'
});
map.addLayer(route_Layer); //增加点位显示的图层

 

//执行方法,加载坐标及连线信息
initRouteInfo();
function initRouteInfo() {
    
    var param = {};
    JSON.stringify(param);
    //============ajax用于获取后台服务提供的坐标信息===============
    $.ajax({
        url: "/getRouteInfo",
        async: true,
        data: JSON.stringify(param), //参数
        method: 'POST',
        dataType: "json",
        cache:false,
        success: function (data) {
            if (data.state) {
                routeInfos = [];
                var routePoints = [];//坐标点位信息
                var routeFeatures = []; //巡检要素

                //声明连线数组
                var coordinatesPolygon = new Array();
                //若线路已展示,清除
                map.removeLayer(vector_line);

                //清除现有地图展示的点位
                for (var m = 0,len=routePopups.length; m < len; m++) {
                    map.removeOverlay(routePopups[m]);
                }
                m= null;

                routePopups  = [];

                //debugger;
                var changdu = data.data.length;
                for( var w = 0; w < changdu; w++){
                  
                    var allRoute = data.data[0];
                    routeInfos.push(allRoute);

                    for (var k = 0, len = allRoute.length; k < len; k++) {
                        var routeinfo = [];//单个坐标点信息
                        if (allRoute[k].lng != undefined
                               && allRoute[k].lng != 0) {
                            routeinfo.push(allRoute[k].lng);
                            routeinfo.push(allRoute[k].lat);
                            routeinfo.push(allRoute[k].mc);
                            routeinfo.push(allRoute[k].zt);

                            routePoints.push(routeinfo);
                        }
                        routeinfo = null;
                    }
                    k = null;
                    allRoute = null;

                }
                w = null;

                //start 根据状态(zt)赋予不同点位不同的样式,生成点要素
                for (var i = 0,len=routePoints.length; i < len; i++) {
                    var iconFeature = new ol.Feature({
                        name : 'station',
                        geometry : new ol.geom.Point(ol.proj
                                .transform([ routePoints[i][0], routePoints[i][1] ],
                                        'EPSG:4326', 'EPSG:3857')),
                        id : routePoints[i][2],
                        x : routePoints[i][0],
                        y : routePoints[i][1]
                    });
                    if(routePoints[i][3]=="ok"){
                        iconFeature.setStyle(StyleFunction(routePoints[i][2],1));//坐标点赋 样式
                        //转换坐标,给需要连线需要的数组赋值(给zt=ok的点位连线,若全部点位连线,放开下面赋值代码即可(6行后))
                        var pointTransform = ol.proj.transform([routePoints[i][0], routePoints[i][1]], 'EPSG:4326', 'EPSG:3857');
                        coordinatesPolygon.push(pointTransform);
                    }else {
                        iconFeature.setStyle(StyleFunction(routePoints[i][2],0));
                    }
                    routeFeatures.push(iconFeature);

                    iconFeature = null;

                    //给连线需要的数组赋值
                    //var pointTransform = ol.proj.transform([routePoints[i][0], routePoints[i][1]], 'EPSG:4326', 'EPSG:3857');
                    //coordinatesPolygon.push(pointTransform);
                }
                route_Layer.setSource(null);
                route_Layer.setSource(new ol.source.Vector({
                    features : routeFeatures
                }));
                i = null;
                routeFeatures = null;
                routePoints = null;

                toline(coordinatesPolygon);
                coordinatesPolygon = null;
            }

            data = null;
        },
       
    });
    //=========================结束============
    param = null;
};
//坐标点 之间画线
function toline(coordinatesPolygon){//直接传入转换后的坐标点数据

    //瓦片图层
    var tileLayer = new ol.layer.Tile({
        source:new ol.source.OSM()
    });
    var source = new ol.source.Vector();
    //矢量图层
    vector_line = new ol.layer.Vector({
        source: source,
        style: new ol.style.Style({
            fill: new ol.style.Fill({
                color: 'rgba(255, 255, 255, 0.1)'
            }),
            stroke: new ol.style.Stroke({//地图连线的样式
                color: 'red',//颜色
                width: 10//宽度
            }),
            image: new ol.style.Circle({
                radius: 10,
                fill: new ol.style.Fill({
                    color: '#ffcc33'
                })
            })
        })
    });
    //多边形此处注意一定要是[坐标数组]
    console.log("画线的坐标集合为="+coordinatesPolygon);
    var plygon = new ol.geom.Polygon([coordinatesPolygon])
    //多边形要素类
    var feature = new ol.Feature({
        geometry: plygon,
    });

    source.addFeature(feature);

    map.addLayer(vector_line);


}

//给坐标点赋值样式

function  StyleFunction(name,type) {
    if(type==1) {
        return new ol.style.Style({
            image : new ol.style.Icon(
                    {
                        anchor : [ 0.5, 1 ],
                        //anchorXUnits: 'fraction',
                        //anchorYUnits: 'pixels',
                        src : '${pageContext.request.contextPath}/resources/lib/gislib/imgs/routenormal.png'
                    })
            //text: createTextStyle(name)//坐标点名称,需要可以显示
        });
    }else {
        return new ol.style.Style({
            image : new ol.style.Icon(
                    {
                        anchor : [ 0.5, 1 ],
                        //anchorXUnits: 'fraction',
                        //anchorYUnits: 'pixels',
                        src : '${pageContext.request.contextPath}/resources/lib/gislib/imgs/routeerror.png'
                    })
            //text: createTextStyle(name)//坐标点名称,需要可以显示
        });
    }
}

//坐标点 显示名称

function createTextStyle(name) {
    return new ol.style.Text({
        text: name,
        offsetX: 0,
        offsetY: -197,
        fill: new ol.style.Fill({
            color: 'white'
        }),

        font: 'bold 26px 微软雅黑,sans-serif',

    });
};
function fRandomBy(under, over) {
    switch (arguments.length) {
        case 1:
            return parseInt(Math.random() * under + 1);
        case 2:
            return parseInt(Math.random() * (over - under + 1) + under);
        default:
            return 0;
    }
}

</script>

 

最后附上效果图,如下(本图效果是先添加的坐标点位route_layer,线的连接覆盖了点,若线连接不覆盖点,先add线的图层

vector_line即可.

)

转载自:https://blog.csdn.net/yc15128221056/article/details/84585872