Добавьте InfoWindow, легенду, масштабную линейку и векторный слой вместе

Я пытаюсь использовать JavaScript, чтобы добавить легенду, двойную шкалу, векторный слой и информационное окно вместе на одной html-странице. Однако, когда я могу добавить масштабную линейку, векторный слой и информационное окно, добавление кодов javascript информационного окна приведет к исчезновению всех моих функций. Однако, когда я пытаюсь сначала добавить информационное окно, а затем добавить легенду, масштабную линейку и векторный слой, все также исчезает. Ниже приведен мой код для добавления легенды, векторного слоя и масштабной линейки, а затем информационного окна. Все работает, кроме информационного окна, и я не могу понять, почему. Вроде есть проблема с размещением кодов в JavaScript? Какая-то конкретная последовательность, которую я не выполнил?

<!DOCTYPE html>
<html>
<head>
    <!-- add in meta elements -->
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
    <title>Mock Practical</title>
    <!-- reference styles -->
    <link rel="stylesheet" href="http://js.arcgis.com/3.9/js/esri/css/esri.css">
    <link rel="stylesheet" href="http://js.arcgis.com/3.9/js/dojo/dijit/themes/claro/claro.css">
    <!-- reference arcGIS javascript -->
    <script src="http://js.arcgis.com/3.9/"></script>
    <style>
        html, body {
            height: 97%;
            width: 98%;
            margin: 1%;
        }

        #rightPane {
            width: 20%;
        }

        #legendPane {
            border: solid #97DCF2 1px;
        }
    </style>
    <!-- javascript -->
    <script>
     var map;
     require([
     "esri/map", "esri/dijit/InfoWindowLite",
     "esri/InfoTemplate", "esri/layers/FeatureLayer", "esri/dijit/Legend",
     "dojo/_base/array", "dojo/parser", "esri/dijit/Scalebar",
     "dijit/layout/BorderContainer", "dijit/layout/ContentPane",
    "dijit/layout/AccordionContainer",  "dojo/dom-construct", "dojo/domReady!"
     ], function(
     Map, InfoWindowLite, InfoTemplate, FeatureLayer, Legend,
     arrayUtils, parser,  Scalebar, domConstruct
     ) {
     parser.parse();
     map = new Map("map", {
     basemap:"topo",
     center: [-98.416, 39.781],
     zoom: 6
     });

      // scalebar
      var scalebar = new Scalebar({
          map: map,
          // "dual" displays both miles and kilmometers
          // "english" is the default, which displays miles
          // use "metric" for kilometers
          scalebarUnit: "dual", attachTo:"bottom-center"

        });

     // feature layer
    var featureLayer = new
     FeatureLayer("http://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3", {
     mode: FeatureLayer.MODE_ONDEMAND,
     outFields:["STATE_NAME", "SUB_REGION", "STATE_ABBR"]
     });
     //map.addLayer(featureLayer);


     //add the legend
     map.on("layers-add-result", function (evt) {
     var layerInfo = arrayUtils.map(evt.layers, function (layer, index) {
     return {layer:layer.layer, title:layer.layer.name};
     });
     if (layerInfo.length > 0) {
     var legendDijit = new Legend({
     map: map,
     layerInfos: layerInfo
     }, "legendDiv");
     legendDijit.startup();
     }
     });
     map.addLayers([featureLayer]);


     var legendFeature = new
    FeatureLayer("http://www.onemap.sg/ArcGIS/rest/services/TOC/MapServer/6", {
     mode: FeatureLayer.MODE_ONDEMAND,
     outFields:["*"]
     });

     // infoWindow
     var infoWindow = new InfoWindowLite(null, domConstruct.create("div", null, null,
    map.root));
     infoWindow.startup();
     map.setInfoWindow(infoWindow);

     var template = new InfoTemplate();
    template.setTitle("<b>State name ${STATE_NAME} - State abbr ${STATE_ABBR}</b>");
    template.setContent("${SUB_REGION} is in district ${STATE_NAME}.");
    map.addLayer(featureLayer);
    map.infoWindow.resize(200,75);
     });

    </script>

</head>

<body class="claro">
    <div id="content" data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="design:'headline', gutters:true" style="width: 100%; height: 100%; margin: 0;">
        <div id="rightPane" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'right'">
            <div data-dojo-type="dijit/layout/AccordionContainer">
                <div data-dojo-type="dijit/layout/ContentPane" id="legendPane" data-dojo-props="title:'Legend', selected:true">
                    <div id="legendDiv"></div>
                </div>
                <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="title:'Pane 2'">
                    This pane could contain tools or additional content
                </div>
            </div>
        </div>
        <div id="map" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'center'" style="overflow:hidden;">

        </div>

    </div>
</body>
</html>

person user3763216    schedule 30.06.2015    source источник


Ответы (2)


Я нашел несколько небольших ошибок в приведенном выше фрагменте кода. Ниже приведены подробности.

  1. забудьте добавить «BorderContainer, ContentPane, AccordionContainer» перед domConstruct
  2. вы не добавляли этот объект информационного шаблона в векторный слой.

Ниже приведен рабочий код:

<!DOCTYPE html>
<html>
<head>
    <!-- add in meta elements -->
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
    <title>Mock Practical</title>
    <!-- reference styles -->
    <link rel="stylesheet" href="http://js.arcgis.com/3.9/js/esri/css/esri.css">
    <link rel="stylesheet" href="http://js.arcgis.com/3.9/js/dojo/dijit/themes/claro/claro.css">
    <!-- reference arcGIS javascript -->
    <script src="http://js.arcgis.com/3.9/"></script>
    <style>
        html, body {
            height: 97%;
            width: 98%;
            margin: 1%;
        }

        #rightPane {
            width: 20%;
        }

        #legendPane {
            border: solid #97DCF2 1px;
        }
    </style>
    <!-- javascript -->
    <script>
        var map;
        require([
        "esri/map", "esri/dijit/InfoWindowLite",
        "esri/InfoTemplate", "esri/layers/FeatureLayer", "esri/dijit/Legend",
        "dojo/_base/array", "dojo/parser", "esri/dijit/Scalebar",
        "dijit/layout/BorderContainer", "dijit/layout/ContentPane",
       "dijit/layout/AccordionContainer", "dojo/dom-construct", "dojo/domReady!"
        ], function (
        Map, InfoWindowLite, InfoTemplate, FeatureLayer, Legend,
        arrayUtils, parser, Scalebar, BorderContainer, ContentPane, AccordionContainer, domConstruct
        ) {
            parser.parse();
            map = new Map("map", {
                basemap: "topo",
                center: [-98.416, 39.781],
                zoom: 6
            });

            // scalebar
            var scalebar = new Scalebar({
                map: map,
                // "dual" displays both miles and kilmometers
                // "english" is the default, which displays miles
                // use "metric" for kilometers
                scalebarUnit: "dual", attachTo: "bottom-center"

            });

            var template = new InfoTemplate("<b>State name ${STATE_NAME} - State abbr ${STATE_ABBR}</b>", "${SUB_REGION} is in district ${STATE_NAME}.");
            //template.setTitle("<b>State name ${STATE_NAME} - State abbr ${STATE_ABBR}</b>");
            //template.setContent("${SUB_REGION} is in district ${STATE_NAME}.");

          //  map.infoWindow.resize(200, 75);

            // feature layer
            var featureLayer = new FeatureLayer("http://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3", {
                 mode: FeatureLayer.MODE_ONDEMAND,
                 outFields: ["STATE_NAME", "SUB_REGION", "STATE_ABBR"],
                 infoTemplate: template
             });
              map.addLayer(featureLayer);


            //add the legend
            map.on("layers-add-result", function (evt) {
                var layerInfo = arrayUtils.map(evt.layers, function (layer, index) {
                    return { layer: layer.layer, title: layer.layer.name };
                });
                if (layerInfo.length > 0) {
                    var legendDijit = new Legend({
                        map: map,
                        layerInfos: layerInfo
                    }, "legendDiv");
                    legendDijit.startup();
                }
            });
            map.addLayers([featureLayer]);


            var legendFeature = new FeatureLayer("http://www.onemap.sg/ArcGIS/rest/services/TOC/MapServer/6", {
               mode: FeatureLayer.MODE_ONDEMAND,
               outFields: ["*"]
           });

            // infoWindow
           // var infoWindow = new InfoWindowLite(null, domConstruct.create("div", null, null,
           //map.root));
           // infoWindow.startup();
           // map.setInfoWindow(infoWindow);


        });

    </script>

</head>

<body class="claro">
    <div id="content" data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="design:'headline', gutters:true" style="width: 100%; height: 100%; margin: 0;">
        <div id="rightPane" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'right'">
            <div data-dojo-type="dijit/layout/AccordionContainer">
                <div data-dojo-type="dijit/layout/ContentPane" id="legendPane" data-dojo-props="title:'Legend', selected:true">
                    <div id="legendDiv"></div>
                </div>
                <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="title:'Pane 2'">
                    This pane could contain tools or additional content
                </div>
            </div>
        </div>
        <div id="map" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'center'" style="overflow:hidden;">

        </div>

    </div>
</body>
</html>
person Vikash Pandey    schedule 04.07.2015
comment
эй, это работает, спасибо! не могли бы вы уточнить, как мне узнать последовательность для добавления в список требований? - person user3763216; 08.07.2015
comment
еще одна вещь, требующая, чтобы вам не нужно было следовать каким-либо соглашениям, просто когда вы даете какое-либо псевдоним, вам нужно следовать той же последовательности ... не стесняйтесь задавать ваши запросы, если требуются какие-либо разъяснения, или я нигде не ясен .. :) - person Vikash Pandey; 09.07.2015

На самом деле это стандарт структуры додзё AMD... например, сколько виджетов вам нужно, вы должны дать ему псевдоним в том же порядке... Псевдоним может быть любым xyz понятным для вас, однако, когда вы будете использовать эти виджеты додзё в вашем приложении вы должны использовать этот псевдоним для инициализации этого виджета.

С сайта Додзё:

Основой современного Dojo является функция require(). Он создает замыкание кода JavaScript и предоставляет ему модули, необходимые для выполнения работы, в качестве возвращаемых переменных, передаваемых функции в качестве аргументов. Обычно первый аргумент представляет собой массив идентификаторов модулей (MID), а второй — функцию. В закрытии require() мы ссылаемся на модули на основе имени переменной, которое мы объявили в аргументе. Хотя мы могли бы называть модуль как угодно, существуют некоторые общие соглашения, которые используются и обычно отмечаются в Справочное руководство по додзё.

Modern Dojo означает просто dojo AMD или формат dojo 1.7 и выше...

Надеюсь, что это поможет вам :)

person Vikash Pandey    schedule 09.07.2015