arcgis api for js 加載天地圖和實現點聚合效果(完整版)


一先了解切片服務的源頭TiledMapServiceLayer

TiledMapServiceLayer類是一切切片服務的源頭,該類是一個抽象類,只能被子類來實例化,但是它卻了方位切片服務所需要的方法,下面看看該類的屬性和方法:

主要屬性
屬性 說明
fullExtent 地圖服務的范圍
initExtent 地圖服務的初始范圍
spatialReference 地圖服務的空間參考    
tileInfo 瓦片信息,該類包含切片的信息
   
主要方法
方法 說明
getTileUrl 獲取每一個切片的URl,這個方法是當地圖移動,放大縮小的時候會發生,然后獲取每一個切片的並獲得圖片進行顯示

 

二定義一個類繼承該抽象類

 

define(["dojo/_base/declare",
    "esri/layers/tiled"],
    function (declare) {
        return declare(esri.layers.TiledMapServiceLayer, {
            _maptype:"",
            constructor: function (maptype) {
                this._maptype = maptype;
                this.spatialReference = new esri.SpatialReference({ wkid: 4326 });
                this.initialExtent = (this.fullExtent = new esri.geometry.Extent(-180.0, -90.0, 180.0, 90.0, this.spatialReference));
                this.tileInfo = new esri.layers.TileInfo({
                    "rows": 256,
                    "cols": 256,
                    "compressionQuality": 0,
                    "origin": {
                        "x": -180,
                        "y": 90
                    },
                    "spatialReference": {
                        "wkid": 4326
                    },
                    "lods": [
                        { "level": 2, "resolution": 0.3515625, "scale": 147748796.52937502 },
                        { "level": 3, "resolution": 0.17578125, "scale": 73874398.264687508 },
                        { "level": 4, "resolution": 0.087890625, "scale": 36937199.132343754 },
                        { "level": 5, "resolution": 0.0439453125, "scale": 18468599.566171877 },
                        { "level": 6, "resolution": 0.02197265625, "scale": 9234299.7830859385 },
                        { "level": 7, "resolution": 0.010986328125, "scale": 4617149.8915429693 },
                        { "level": 8, "resolution": 0.0054931640625, "scale": 2308574.9457714846 },
                        { "level": 9, "resolution": 0.00274658203125, "scale": 1154287.4728857423 },
                        { "level": 10, "resolution": 0.001373291015625, "scale": 577143.73644287116 },
                        { "level": 11, "resolution": 0.0006866455078125, "scale": 288571.86822143558 },
                        { "level": 12, "resolution": 0.00034332275390625, "scale": 144285.93411071779 },
                        { "level": 13, "resolution": 0.000171661376953125, "scale": 72142.967055358895 },
                        { "level": 14, "resolution": 8.58306884765625e-005, "scale": 36071.483527679447 },
                        { "level": 15, "resolution": 4.291534423828125e-005, "scale": 18035.741763839724 },
                        { "level": 16, "resolution": 2.1457672119140625e-005, "scale": 9017.8708819198619 },
                        { "level": 17, "resolution": 1.0728836059570313e-005, "scale": 4508.9354409599309 },
                        { "level": 18, "resolution": 5.3644180297851563e-006, "scale": 2254.4677204799655 }
                    ]
                });
                this.loaded = true;
                this.onLoad(this);
            },
            getTileUrl: function (level, row, col) {
                return "http://t" + col % 8 + ".tianditu.cn/"+this._maptype+"_c/wmts?"+
                    "SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER="+this._maptype+
                    "&STYLE=default&TILEMATRIXSET=c&TILEMATRIX=" +
                    level + "&TILEROW=" + row + "&TILECOL=" + col + "&FORMAT=tiles";
            }
        });
    });

關於那個getTileurl函數中返回的地址為何這么拼接

上面紅框中的地址,復制打開瀏覽器,然后F12在網絡(這里火狐瀏覽器)中獲取header中的請求地址就可以知道為什么這么拼接了。

三、模塊的引用示例

        var path = this.location.pathname.replace(/\/[^/]+$/, "");
        var dojoConfig = {
            parseOnLoad: true,
            packages: [{
                "name": "MapCluster",
                "location": path + "/lib"
            } ]
        };

不懂怎么引用模塊看這點擊打開鏈接

四、注冊map的load事件

                    map.on("Load", function () {
                        addClusterLayer(county.items);
                    });

五、addClusterLayer函數的封裝

function addClusterLayer(items) {
                        var countyInfo = {};
                        var latlng1 = new Point(map.extent.xmax, map.extent.ymax, map.spatialReference); //右上角  
                        var latlng2 = new Point(map.extent.xmin, map.extent.ymin, map.spatialReference); //左下角  
                        var webMercator1 = webMercatorUtils.geographicToWebMercator(latlng1);
                        var webMercator2 = webMercatorUtils.geographicToWebMercator(latlng2);
                        var clusterResolution = (webMercator1.x - webMercator2.x) / map.width;
                        countyInfo.data = arrayUtils.map(items, function (item) {
                            var latlng = new Point(parseFloat(item.x), parseFloat(item.y), map.spatialReference);
                            var webMercator = webMercatorUtils.geographicToWebMercator(latlng);
                            var attributes = {
                                "省份": item.attribute.proname,
                                "proCode": item.procode,
                                "市名": item.attribute.name,
                                "lng": item.x,
                                "lat": item.y
                            };
                            return {
                                "x": webMercator.x,
                                "y": webMercator.y,
                                "attributes": attributes
                            };
                        });
                        clusterLayer = new ClusterLayer({
                            "data": countyInfo.data,
                            "distance": 100,
                            "id": "clusters",
                            "labelColor": "#333374",
                            "labelOffset": 16,
                            "singleColor": "#888",                
                            "resolution": clusterResolution,
                            "spatialReference": new SpatialReference({ "wkid": 4326 })
                        });
                        //下面是設置聚合效果模型,根據聚合的點數來分三個等級,不同等級用不同的大小以及顏色圖標來表示,0-2為藍色;2-200為綠色;200-1001為紅色
                        var defaultSym = new esri.symbol.SimpleMarkerSymbol().setSize(4);
                        var renderer = new ClassBreaksRenderer(defaultSym, "clusterCount");
                        var picBaseUrl = "lib/";
                        var blue = new esri.symbol.PictureMarkerSymbol(picBaseUrl + "Marker.png", 32, 32).setOffset(0, 15);
                        var green = new esri.symbol.PictureMarkerSymbol(picBaseUrl + "Marker-1.png", 64, 64).setOffset(0, 15);
                        var red = new esri.symbol.PictureMarkerSymbol(picBaseUrl + "Marker-2.png", 72, 72).setOffset(0, 15);
                        renderer.addBreak(0, 2, blue);
                        renderer.addBreak(2, 100, green);
                        renderer.addBreak(100, 200, red)
                        clusterLayer.setRenderer(renderer);
                        map.addLayer(clusterLayer);
                        map.on("click", cleanUp);
                        map.on("key-down", function (e) {
                            if (e.keyCode === 27) {
                                cleanUp();
                            }
                        });
                    }

六、cleanUp函數的封裝

                    function cleanUp() {
                        map.infoWindow.hide();
                        clusterLayer.clearSingles();
                    }

七、總結

ClusterLayer.js這個文件是要改的,否則無法加載出來,唯一讓我感覺惡心的這個map的load事件是真的惡心,圖標在阿里下載的真的丑(是我自己做的丑)后面的繼續改進

八、最終效果

數據下載(ClusterLayer.js和data.js)點擊打開鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM