arcgis for javascript 用小照片做图标

栏目: 编程工具 · 发布时间: 7年前

内容简介:arcgis for javascript 用小照片做图标

arcgis for javascript 用小照片做图标

如图所示,勾选相关选项,在地图上就显示这两小张图片,点击则出现明细大图。

arcgis for javascript 用小照片做图标

咋整?

首先,这两张小图片不是地图的一部分,也不是从地图服务器里请求回来的,是客户端自己画的,所以,它们位于FeatureLayer。

其次,这两张小图不一样,它们处于不同的FeatureLayer。也就是说,一张图层只能显示一种图标。

具体代码该咋写?

arcgis for javascript 用小照片做图标

图一

图一的代码结构很简单,如果选项”采集照片“点击选中,则检查是否已生成相应FeatureLayer,没有则创建之。

如何创建呢?

首先,FleatureLayer里面有许多选项和字段,要先定义。因为FeatureLayer是在客户端描绘生成的。在我们平常使用的FeatureLayer中,有许多是由地图服务提供的,但地图服务提供的也是定义和数据,并非像切片图层和动态图层那样,传给客户端的是图片。

其次是绑定一些事件。比如图层成功添加的后续处理。我的思路是图标的样式(也就是那两张小图片)并非预先设定,而是根据后台获得的数据来动态生成。所以,图层可以先生成并添加,添加成功后再向后台请求数据,并绘制图标。

上代码。这是前端代码:

//采集照片
(function (map, iconUrlHead, requestUrl) {
    var fls = [];
    $("#chePhoto").click(function () {
        var bv = document.getElementById("chePhoto").checked;

        if (bv == true && fls.length == 0) {
            /* 动态构造要素图层(定义部分) begin */
            var featureCollection = {
                "layerDefinition": null,
                "featureSet": {
                    "features": [],
                    "geometryType": "esriGeometryPoint"
                }
            };
            featureCollection.layerDefinition = {
                "geometryType": "esriGeometryPoint",
                "objectIdField": "ObjectID",
                "drawingInfo": {
                    "renderer": {
                        "type": "simple",
                        "symbol": {
                            "type": "esriPMS",
                            "url": null,
                            "contentType": "image/png",
                            "width": 52.5,//点,这里 1P = 0.75 * 1PX。arcgis的图标不是按像素来画的,而是点。
                            "height": 37.5
                        }
                    }
                },
                "fields": [{
                    "name": "ObjectID",
                    "alias": "ObjectID",
                    "type": "esriFieldTypeOID"
                }, {
                    "name": "description",
                    "alias": "Description",
                    "type": "esriFieldTypeString"
                }, {
                    "name": "title",
                    "alias": "Title",
                    "type": "esriFieldTypeString"
                }]
            };
            /* 动态构造要素图层(定义部分) end */

            //弹窗
            var popupTemplate = new PopupTemplate({
                title: "{title}",
                description: "{description}"
            });

            function getFL(typeId) {
                var iconUrl = iconUrlHead + "map_icon" + typeId + ".png";//根据参数来构造图标
                featureCollection.layerDefinition.drawingInfo.renderer.symbol.url = iconUrl;
                //创建FeatureLayer
                var featureLayer = new FeatureLayer(featureCollection, {
                    id: "photolayer" + typeId,
                    infoTemplate: popupTemplate,
                    visible: false
                });
                featureLayer.on("click", function (evt) {
                    map.infoWindow.setFeatures([evt.graphic]);
                    map.infoWindow.resize(400, 300);
                });
                return featureLayer;
            }
            fls.push(getFL("01"));//创建id=photolayer01的图层
            fls.push(getFL("02"));//创建id=photolayer02的图层

            //绑定 “图层添加成功” 事件
            map.on("layers-add-result", function (results) {
                function requestSucceeded(response, io) {//获取后台数据成功。获取过程是异步的,见下面:requestHandle.then(requestSucceeded, requestFailed);
                    var features = {};
                    array.forEach(response.items, function (item) {
                        var attr = {};
                        attr["description"] = item.description;
                        attr["title"] = item.title ? item.title : "采集照片";
                        var geometry = new Point(item);//new Point(json);json object内容自定义,但必须有坐标值,名称为x、y或longitude、latitude皆可。
                        var graphic = new Graphic(geometry);
                        graphic.setAttributes(attr);
                        if (typeof features[item.type] == 'undefined') features[item.type] = [];
                        features[item.type].push(graphic);
                    });

                    results.layers.forEach(function (resultitem) {
                        var id = resultitem.layer.id.substring("photolayer".length);//图层id=photolayer***
                        resultitem.layer.applyEdits(features[id], null, null);
                    });
                }
                function requestFailed(error) {
                }

                var requestHandle = esriRequest({
                    url: requestUrl,
                    callbackParamName: "jsoncallback"
                });
                //向后台(不是地图服务)请求数据是一个异步的过程
                requestHandle.then(requestSucceeded, requestFailed);
            });

            map.addLayers(fls);
        }

        fls.forEach(function (fl) {
            fl.setVisibility(bv);
        });
    });
})(map,
    "@Url.StaticFile("~/Content/images/map/")",
    "@Url.StaticFile("~/Map/Home/GetPhotos")");

后台代码:

        public ContentResult GetPhotos()
        {
            return new ContentResult
            {
                ContentEncoding = Encoding.GetEncoding("utf-8"),
                ContentType = "text/plain;charset=UTF-8",
                //一个item代表一种图标;图标数据自定义,但必须有坐标值,名称为x、y或longitude、latitude皆可
                Content = $@"{{
""title"": ""近期采集的照片"",
""items"": [
    {{
        ""title"": ""海岛一"",
        ""description"": ""<p><img src=\""{System.Web.HttpContext.Current.Request.ApplicationPath.Replace("/",@"\/")}\/Content\/Images\/Map\/hd1.jpg\"" alt=\""海岛2\"" \/><\/p>"",
        ""latitude"" : ""28.163280"",
        ""longitude"" : ""121.598709"",
        ""type"":""01""
    }},
    {{
        ""title"": ""海岛二"",
        ""description"": ""<p><img src=\""{System.Web.HttpContext.Current.Request.ApplicationPath.Replace("/", @"\/")}\/Content\/Images\/Map\/hd1.jpg\"" alt=\""海岛2\"" \/><\/p>"",
        ""latitude"" : ""29.163280"",
        ""longitude"" : ""121.598709"",
        ""type"":""01""
    }},
    {{
        ""title"": ""珊瑚礁"",
        ""description"": ""<p><img src=\""{System.Web.HttpContext.Current.Request.ApplicationPath.Replace("/", @"\/")}\/Content\/Images\/Map\/hd2.jpg\"" alt=\""海岛2\"" \/><\/p>"",
        ""latitude"" : ""29.609811"",
        ""longitude"" : ""122.341567"",
        ""type"":""02""
    }}]
}}"
            };
        }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Introduction to Graph Theory

Introduction to Graph Theory

Douglas B. West / Prentice Hall / 2000-9-1 / USD 140.00

For undergraduate or graduate courses in Graph Theory in departments of mathematics or computer science. This text offers a comprehensive and coherent introduction to the fundamental topics of graph ......一起来看看 《Introduction to Graph Theory》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试