1. 程式人生 > >高亮地圖點及屬性資訊展示優化方案

高亮地圖點及屬性資訊展示優化方案

作者:小陽

1、序言

本文主要是利用了UTFGrid圖層快速互動獲取地物資訊的特點,以SuperMap iClient for JavaScript的開發作為示範。(注:要實現本文所講述的功能,同時需要SuperMap iServer和SuperMap iClient for JavaScript 7C系列及以上的版本才支援)。

在此之前,我先簡要的講一下什麼是UTFGrid:UTFGrid只包含地物的屬性資訊,可以根據地物的螢幕畫素位置在客戶端快速獲地物的屬性資訊, 如:實現滑鼠懸停或滑鼠單擊某一地物時,快速獲取該地物某些屬性資訊。UTFGrid可由iServer動態生成,也可以將其預先切成瓦片。詳細瞭解UTFGrid(

請參見參見

2、優化思路

1.使用分散式切圖切屬性瓦片快取

這裡要著重說一下UTFGrid單元格網大小的設定,這個值決定了UTFGrid的效率和精準度,設定的值越小精度越高,但是單元格也會越多,在一定程度上也會影響效能,怎樣設定這個引數取決於地物的畫素尺寸。首先,這個引數能被瓦片的大小整除,比如UTFGrid的瓦片大小為256x256,那麼這個值就應該要被256整除。其次,我們需要參考地物在最小比例尺下的畫素尺寸來設定(UTFGrid隱藏的情況下除外),如:在地圖的最小比例尺下點符號的畫素尺寸大概為8x8的大小,這裡可以設定pixcell的值為8x8,在精度允許的情況下,這種情況推薦設定為16x16,因為8x8的單元格比較小,在監聽滑鼠事件時不易成功。
這裡寫圖片描述

2.iServer啟用屬性瓦片快取

預設釋出的地圖服務是沒有啟用 UTFGrid快取的,需要進入到服務管理頁面找到釋出的地圖服務,然後點選進入到快取一欄勾選是否啟用屬性瓦片快取
這裡寫圖片描述

iServer預設將UTFGrid瓦片放置在\webapps\iserver\output\sqlite路徑下。
這裡寫圖片描述

如果不啟用屬性瓦片快取可以使用UTFGrid嗎?答案是肯定的,如果是在大資料量的前提下,建議將UTFGrid預先切成瓦片,下圖是各種方式使用UTFGrid的效能對比。
這裡寫圖片描述

3.程式設計實現

初始化

var map,layer,vectorLayer,infowin,infowin1,highlightFea,popfeature,
                host = document.location.toString().match(/file:\/\//
)?"http://localhost:8090":'http://' + document.location.host, url="http://support.supermap.com.cn:8090/iserver/services/map-changchun/rest/maps/長春市區圖_Local"; var controlmove,controlclick,utfgridPark,utfgridSchool; function init(){ map = new SuperMap.Map("map", {controls: [ new SuperMap.Control.ScaleLine(), new SuperMap.Control.Zoom(), new SuperMap.Control.LayerSwitcher(), new SuperMap.Control.Navigation({ dragPanOptions: { enableKinetic: true } })], projection: "EPSG:0", //設定地圖的最大範圍,這行程式碼相當重要 maxExtent:new SuperMap.Bounds(48.4 , -7668.25,8958.85 , -55.58 ) }); layer = new SuperMap.Layer.TiledDynamicRESTLayer("China", url, {transparent: false}, {useCanvas: true, maxResolution: "auto", scales:[1/2000,1/4000,1/8000,1/16000,1/32000] }); vectorLayer=new SuperMap.Layer.Vector("Vector Layer"); //注意:pixcell與utfgridResolution兩個屬性有對應關係,在使用的時候也要注意場景; //1.其中pixcell為傳送給服務端請求utfgrid瓦片的精度,數值越小,精度越高,相應的瓦片大小也就越大; //2.utfgridResolution為客戶端解析瓦片使用的精度,應該與pixcell的值相等,否則會產生位置與屬性對應不上的問題; //3.通常如果UTFGrid圖層為面圖層,對應的資料量會比較大,為了不影響頁面的正常瀏覽,可以將這兩個屬性設的大一些; //4.isUseCache設定是否使用快取,使用快取能夠提高效能; utfgridSchool = new SuperMap.Layer.UTFGrid("UTFGridLayerSchool", url, { layerName: "[email protected]", utfTileSize: 256, pixcell: 16, isUseCache: true }, { utfgridResolution: 16 }); utfgridSchool.maxExtent=layer.maxExtent; utfgridPark = new SuperMap.Layer.UTFGrid("UTFGridLayerPark", url, { layerName: "[email protected]", utfTileSize: 256, pixcell: 16, isUseCache: true }, { utfgridResolution: 16 }); utfgridPark.maxExtent=layer.maxExtent; //監聽move事件控制元件 controlmove = new SuperMap.Control.UTFGrid({ layers: [utfgridPark,utfgridSchool], callback: callback, handlerMode: "move" }); //監聽click事件控制元件 controlclick = new SuperMap.Control.UTFGrid({ layers: [utfgridPark,utfgridSchool], callback: callback2, }); layer.events.on({"layerInitialized": addLayer}); map.addControl(controlmove); map.addControl(controlclick); map.events.on({"zoomend":reviewUTFgrid}); } function addLayer() { var center = new SuperMap.LonLat(4539.98 , -3835.29); map.addLayers([layer,vectorLayer,utfgridSchool,utfgridPark,]); map.setCenter(center, 0); reviewUTFgrid(); }

高亮點:在這裡,我們利用了Control.UTFGrid監聽move事件的方式,獲取到點的座標,然後繪製一個feature疊加到該點上實現高亮。如果想實現類似於百度地圖每種型別的點都有不同的高亮圖示方式,可以在feature的源資料屬性表裡面加欄位來判斷。實現效果如下:
這裡寫圖片描述

        //move事件回撥函式
        var callback = function (infoLookup) {
            if(infowin)
            map.removePopup(infowin);
            if(highlightFea)
            vectorLayer.removeFeatures(highlightFea);
            if (infoLookup) {
                var info;
                for (var idx in infoLookup) {
                    info = infoLookup[idx];
                    if (info && info.data) {
                        var dom = "<div style='padding: 5px;padding-left:5px;font-size:12px;font-family:Microsoft YaHei;line-height:8px;color: black;background:lightgoldenrodyellow'>" + info.data.name +"<br></br>"+"點選檢視更多..."+ "</div>";
                         //設定x與y的畫素偏移量,不影響地圖瀏覽;
                        var xOff = (1 / map.getScale()) * 0.003;
                        var yOff = -(1 / map.getScale()) * 0.003;
                        var pos = new SuperMap.LonLat(new Number(info.data.X)+xOff,new Number(info.data.Y)+yOff);
                        infowin = new SuperMap.Popup("chicken",
                                pos,
                                new SuperMap.Size(0, 0),
                                dom,
                                false, null);
                        //根據彈窗內容自動調整彈窗大小
                        infowin.autoSize=true;
                        //設定預設樣式不顯示
                        infowin.setBackgroundColor("none");
                        map.addPopup(infowin);
                        highlightFea = new SuperMap.Feature.Vector(new SuperMap.Geometry.Point(info.data.X,info.data.Y),
                                null,
                                {

                                    //繪製向量點方式
//                                    pointRadius:7,
//                                    fillColor:"#3399FF",
//                                    fillOpacity:0.5,
//                                    strokeColor:"#0033FF",
//                                    strokeWidth:3,
//                                    strokeOpacity:0.2
                                    //引用圖片方式
                                    externalGraphic:"image/h12.png",
                                    graphicWidth:15,
                                    graphicHeight:15

                                }
                        );
                        vectorLayer.addFeatures([highlightFea]);
                    }
                }
            }
        };

彈窗展示:利用Control.UTFGrid監聽click事件的方式,並結合Popup展示地物的資訊,這裡的Popup為自定義的CSS樣式,因為Popup本身為div,可以任意設計CSS樣式。實現效果如下:
這裡寫圖片描述

 //點選彈窗回撥函式
        var callback2=function(infoLookup1)
        {
            if(infowin1)
                map.removePopup(infowin1);
            if(popfeature)
                vectorLayer.removeFeatures(popfeature);
            if (infoLookup1) {
                if (infoLookup1) {
                    var info1;
                    for (var idx1 in infoLookup1) {
                        info1 = infoLookup1[idx1];
                        if (info1 && info1.data) {
                            var dom1 = "<div class='pop' >" +
                                    "<div class='pop_header'><div class='pop_close' onclick='closeInfoWin1()'></div></div>" +
                                    "<img src='image/park.png' style='height: auto;width: auto;max-width: 100%;opacity: 1'>" +
                                    "<div class='pop_content'><p><span>地點:</span><span>" + info1.data.name + "</span></p><p><span>座標:</span><span>x:" + info1.data.X + "  y:" + info1.data.Y + "</span></p></div>" +
                                    "<div class='pop_arrow'></div>" +
                                    "</div>";
                            var xOff1 = -(1 / map.getScale()) * 0.018;
                            var yOff1 = (1 / map.getScale()) * 0.035;
                            var pos1 = new SuperMap.LonLat(new Number(info1.data.X) + xOff1, new Number(info1.data.Y) + yOff1);
                            infowin1 = new SuperMap.Popup("chicken",
                                    pos1,
                                    new SuperMap.Size(20, 20),
                                    dom1,
                                    false, null);
                            //根據彈窗內容自動調整彈窗大小
                            infowin1.autoSize = true;
                            //設定預設樣式不顯示
                            infowin1.backgroundColor = "none";
                            //移動地圖以確保彈窗顯示在視窗內
                            infowin1.panMapIfOutOfView=true;
                            map.addPopup(infowin1);
                            popfeature = new SuperMap.Feature.Vector(new SuperMap.Geometry.Point(info1.data.X, info1.data.Y),
                                    null,
                                    {
                                        externalGraphic: "image/radar.gif",
                                        graphicWidth: 64,
                                        graphicHeight: 64
                                    }
                            );
                            vectorLayer.addFeatures([popfeature]);
                        }
                    }
                }
            }
        };

相關推薦

地圖屬性資訊展示優化方案

作者:小陽 1、序言 本文主要是利用了UTFGrid圖層快速互動獲取地物資訊的特點,以SuperMap iClient for JavaScript的開發作為示範。(注:要實現本文所講述的功能,同時需要SuperMap iServer和Super

部落格園自定義頁面風格設計 後續篇(頁面設計模式程式碼 滑鼠選效果升級)

前言 在之前所寫過的部落格園自定義頁面風格設計篇中,我們已經說明了其中兩種風格的頁面設計,滑鼠圖案的修改,公告欄的設定,背景音樂的製作,關於CSS以及用Canvas和requestAnimFrame做動畫特效,在本文中我們將教大家制作當前簡約的頁面製作方法。 只要你們有需求,我會盡量幫助到大家,在此感謝各

織夢cms導航顯示欄目首頁的方法

網站 field 紅色 typeid 高亮顯示 php 亮顯 一定的 是否 直奔主題了,高亮顯示教程適用於您具有一定的CSS基礎才可以了,前提把高亮顯示的樣式寫好,然後再開始高亮顯示標簽適用。 <li {dede:field name=typeid runphp="y

地圖01---在activity中展示地圖

1 高德官網下載2D地圖開發包並匯入jar包 2 申請key,配置在工程的“AndroidManifest.xml”檔案中 <application android:allowBackup="true" android:icon="@drawabl

地圖聚合改進

        目錄 最後的圈圈上顯示資訊 完整程式碼  最終效果        專案要求需要用到點聚合https://lbs.amap.com/api/javascript-api/e

(一)地圖之基本屬性以及顯示模式

       我們在開發中常常會用到地圖功能,那麼我們最常用的就是百度地圖和高德地圖了,今天我們就來看一下高德地圖怎麼用,我個人認為高德地圖封裝的還是比較好的,使用起來方便快捷。 首先我們需要到高德開發者平臺註冊賬號,根據API進行操作即可,高德開放平

安卓地圖聚合功能

最近需要實現地圖的點聚合功能,由於剛開始專案中使用的是高德地圖,檢視Android高德地圖的官方文件,發現沒有這個功能,要自己實現了,下面把demo原始碼貼出來供大家參考! 先上圖: 下面就來看看是如何實現的吧···· 下面直接上程式碼: 佈局檔案程式碼:ac

地圖選氣泡跳轉到其它地圖

高德地圖的周邊搜尋,在點選Mark上的氣泡可以跳轉到手機中的地圖進行導航 @Override public void onInfoWindowClick(Marker marker) {

Android簡單實現地圖顯示定位

1、要實現高德地圖的定位,首先要下載高德地圖的SDK 下載地址:http://lbs.amap.com/api/android-location-sdk/download/ 然後在高德地圖官網上登入你註冊的賬號並且去控制檯

根據地址獲得地圖標記

如何根據地址獲取該地址在高德地圖上的點標記呢,跟我一起來看看吧。一、在高德地圖開發者平臺申請一個key.點選http://lbs.amap.com進入高德開發平臺。註冊登入就不用說了。登入後在我的應用中新增key如下圖:進入示例中心。如下圖:三、接下來將示例中的程式碼嵌入到你

移動端html5頁面長按實現全選文字內容的相容解決方案

最近需要給html5的WebAPP在頁面上實現一個複製功能:使用者點選長按文字會全選文字並彈出系統“複製”選單,使用者可以點選“複製”進行復制操作,然後貼上到AppStore搜尋對應的應用。之所以不是採用連結形式直接跳轉到AppStore對應應用是為了通過使用者的主動輸入關鍵詞搜尋給推廣的企業App

地圖 key獲取與Key錯誤解決方案

鑑於Android版SDK中出現的大量key驗證失敗問題,基本上都是在API控制檯申請AK的時候填寫的包名或者SHA1不正確導致的(包名或者SHA1的獲取詳見官方教程)。搜尋log,若出現"Authentication Error errorcode: 230 uid: -1 appid -1 msg: A

關於在IE中a標籤設定絕對定位和寬之後卻選沒有反應的解決方案

最近做了一個頁面,是一張大的背景圖,在背景圖上面有幾個表單元素,程式碼結構大致如下: <div class="huishi" id="form1" style="background:url(images/huishi_bg.png) no-repeat;"&g

百度地圖聚合MarkerClusterer,效能優化

百度的點聚合演算法 是基於方格和距離的聚合演算法,即開始的時候地圖上沒有任何已知的聚合點,然後遍歷所有的點,去計算點的外包正方形(由gridSize指定),若此點的外包正方形與現有的聚合點的外包正方形不相交,則新建聚合點,若相交就把該點加到該聚合點,效果如下圖,為了便於

vim 配置檔案.vimrc,+自動縮排+行號+摺疊+優化

set mouse=aset cursorline " 突出顯示當前行set ruler " 開啟狀態列標尺set shiftwidth=4 " 設定 << 和 >> 命令移動時的寬度為 4set softtabstop=4 " 使得按退格鍵時可以一次刪掉 4 個空格set tabs

系統優化筆記 - 商品系統資料展示優化方案

背景 目前手上有一個微信優惠券搶購系統,由於在初期限於客戶的工期、使用者規模不夠大、併發量小等情況下,除了搶購、銷售資料利用了 Redis外,其他的均是直連資料庫進行操作。 系統使用的技術:spring boot全家桶、mybatis,spring data jpa、Redis、MySQL等。spring d

基於地圖的描操作,監聽地圖縮放,展示合理數量的marker

angle lease div href 函數 其中 如果 pla java 原文:基於高德地圖的描點操作,監聽地圖縮放,展示合理數量的marker 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.cs

echarts中國地圖使省份選擇性滑動或

本文介紹echarts顯示中國省份圖,對於需要高亮的省份進行篩選。並且對省份進行選擇性互動。 首先我們需要一個顏色集合,代表我們要設定多少種顏色。這裡用到了dataRange。 dataRange: { show:false, x: 'lef

騰訊地圖覆蓋物新增選事件說明資訊------vue

export default { props: { words: { type: String, default: '' } }, data() { return { searchService: [], map:

antd table 行選事件顯示

1.antd官網表格元件: 2.引用antd的表格元件,即: import {Table} from ‘antd’; 渲染表格元件: 說明: (1)rowClassName屬性是新增表格行樣式屬性,此時的this.setClassName方法為點選行之後為其