4 votos

¿Añadir una capa utilizando la respuesta esriRequest en la API de ArcGIS para JavaScript?

Por diversas razones necesito añadir capas a un objeto de mapa utilizando una respuesta devuelta por un esriRequest a un ArcGIS Server. Una de las razones es que los datos cambian constantemente y la codificación de URLs de FeatureLayer sería ineficiente.

He logrado devolver un objeto JSON que contiene la atribución que parece ser los mismos datos que uno vería en el nodo REST de las capas.

 maps = [];

require([
    "esri/map", "esri/layers/FeatureLayer", 
    "esri/dijit/Print", "esri/tasks/PrintTemplate", "esri/request", 
    "esri/config","esri/dijit/BasemapToggle",

    "dojo/_base/array", "dojo/dom", "dojo/parser",  "dojo/domReady!"

], function (Map, FeatureLayer,Print, PrintTemplate, esriRequest,      esriConfig,BasemapToggle,arrayUtils, dom, parser){

parser.parse();

console.log("Map Start");

esriConfig.defaults.io.proxyUrl = "http://........./proxy.ashx";

maps.addRespLyrs = function addRespLyrs (layer) {
    if (layer.type == "Feature layer") {
        console.log(layer.name);
        maps.map.addLayer(layer);
    }
}; 

maps.handleMapInfo = function handleMapInfo (resp) {
    console.log("handleMapInfo called");
    maps.layers = resp.layers;
    console.log(maps.layers);
    for (i in maps.layers) {
        var layer = maps.layers[i];
        maps.addRespLyrs(layer);
    }
};

maps.layerRequest = function layerRequest () {
    var mapInfo = esriRequest({
        "url": "https://........./Application Name/MapServer/layers",
        "content" : {"f":"json"},
        "handleAs" : "json",
        "callbackParamName" : "callback"
    });
    mapInfo.then(maps.handleMapInfo);
};

maps.map = new Map("cpCentCent", {
    basemap:"topo",
    center: [-98.5795, 39.8282],
    zoom: 5
});

console.log("Map End");

Al intentar añadir los datos mediante el método addLayer() recibo un error lanzado desde lo más profundo de la API de esri.

init.js:199 TypeError: a.id.match no es una función( ) "TypeError: a.id.match no es una función

¿Alguna idea de lo que puede estar fallando aquí o de cómo crear una capa a partir de mi JSON?

0 votos

A ver si esta discusión le sirve de orientación: geonet.esri.com/thread/65193

0 votos

geothread.net/importing-geojson-data-in-arcgis-javascript-maps puede ayudar, tendrá que ser alterado para sus datos JSON. Si ejecuta un servidor web local en su máquina y descarga la biblioteca AsrCGIS JS puede hacerlo.

0 votos

¿podría publicar una parte de su archivo de capas de características json

1voto

Mintx Puntos 2627

Creo que necesitas usar esri/layers/FeatureLayer en algún lugar de aquí, porque el maps.map.addLayer espera una clase de capa como entrada. Parece que estás pasando un objeto json en lugar de un objeto de clase de capa.

Atrapa la URL de tu esriRequest y construir una nueva FeatureLayer a partir de ella, algo así como

featLayer = new FeatureLayer(urlFromRequest);
maps.map.addLayer(featLayer);

0 votos

Tienes razón sobre la necesidad de crear primero el esri/layers/FeatureLayer, y luego pasarlo a addLater(). Voy a añadir una respuesta tot su puesto para reflejar los cambios que hice a mi código anterior.

0voto

AndrewMurray Puntos 8

Aunque todavía puede haber una mejor manera de hacer esto, he sido capaz de añadir capas mediante la adición del siguiente código utilizando @Mintx 's consejo..

    maps.addRespLyrs = function addRespLyrs (layer,layerURL) {
    console.log("addRespLys Called...");
    if (layer.type == "Feature Layer") {
        console.log(layer.name);
        console.log(layerURL);
        var featLayer = new FeatureLayer(layerURL);
        maps.map.addLayer(featLayer);
    }
}; 

maps.handleMapInfo = function handleMapInfo (resp) {
    console.log("handleMapInfo called");
    maps.layers = resp.layers;
    console.log(maps.layers);
    for (i in maps.layers) {
        var layer = maps.layers[i];
        //console.log(JSON.stringify(layer));
        var layerURL = maps.mapServerURL + "/" + layer.id;
        maps.addRespLyrs(layer,layerURL);
    }
};

maps.layerRequest = function layerRequest () {
    maps.mapServerURL= "https://....../MapServer"
    var mapInfo = esriRequest({
        "url": maps.mapServerURL + "/layers",
        "content" : {"f":"json"},
        "handleAs" : "json",
        "callbackParamName" : "callback"
    });
    mapInfo.then(maps.handleMapInfo);
};

Lo que se hace en lo anterior es dividir las URL en trozos. Hay una "URL principal" ( http://ArcGISServerURL.domain/webAdaptor/rest/services/NameOfService/MapServer ) a la que añadimos "/layers" cuando hacemos la petición de esri para poder devolver todas las capas y su información relevante. De la respuesta generada podemos obtener el ID de la capa y así crear una nueva capa de características añadiendo la "URL principal" con el ID de la respuesta. ( http://ArcGISServerURL.domain/webAdaptor/rest/services/NameOfService/MapServer/id )

0voto

todd kman Puntos 11

Esri json to feature layer en 2018:

ejemplo de url de solicitud de api de arcgis rest:

http://xxxx.com/xxx/rest/services/Maps_and_Indices/MapServer/2/query?f=pjson&returnCountOnly=false&outFields=*&outSR=4326&where=DISTRICT%20=%20%27129B149%27%20or%20TILE_NAME%20=%20%27129B149%27%20or%20TOOLTIP%20=%20%27129B149%27%20or%20NLA_URL%20=%20%27129B149%27

decodificar la URL:

 http://xxxx.com/xxx/rest/services/Maps_and_Indices/MapServer/2/query?f=pjson&returnCountOnly=false&outFields=*&outSR=4326&where=DISTRICT = '129B149' or TILE_NAME = '129B149' or TOOLTIP = '129B149' or NLA_URL = '129B149'

datos: cualquier api arcgis rest return (respuesta)

ejemplo (datos) :

            {
             "displayFieldName": "TILE_NAME",
             "fieldAliases": {
              "OBJECTID": "OBJECTID",
              "DISTRICT": "DISTRICT",
              "TILE_NAME": "TILE_NAME",
              "TOOLTIP": "TOOLTIP",
              "NLA_URL": "NLA_URL"
             },
             "geometryType": "esriGeometryPolygon",
             "spatialReference": {
              "wkid": 4326,
              "latestWkid": 4326
             },
             "fields": [
              {
               "name": "OBJECTID",
               "type": "esriFieldTypeOID",
               "alias": "OBJECTID"
              },
              {
               "name": "DISTRICT",
               "type": "esriFieldTypeString",
               "alias": "DISTRICT",
               "length": 16
              },
              {
               "name": "TILE_NAME",
               "type": "esriFieldTypeString",
               "alias": "TILE_NAME",
               "length": 32
              },
              {
               "name": "TOOLTIP",
               "type": "esriFieldTypeString",
               "alias": "TOOLTIP",
               "length": 66
              },
              {
               "name": "NLA_URL",
               "type": "esriFieldTypeString",
               "alias": "NLA_URL",
               "length": 78
              }
             ],
             "features": [
              {
               "attributes": {
                "OBJECTID": 1120,
                "DISTRICT": "WESTLA",
                "TILE_NAME": "129B149",
                "TOOLTIP": "District: WESTLA\\nTile: 129B149",
                "NLA_URL": "navigatela/reports/cadastral_map_index.cfm?pk=129B149"
               },
               "geometry": {
                "rings": [
                 [
                  [
                   -118.45870522159555,
                   34.053800267113971
                  ],
                  [
                   -118.44549967992378,
                   34.053813128253687
                  ],
                  [
                   -118.44548872993352,
                   34.045569527150292
                  ],
                  [
                   -118.45869298464309,
                   34.045556665428208
                  ],
                  [
                   -118.45870522159555,
                   34.053800267113971
                  ]
                 ]
                ]
               }
              }
             ]
            }

Por ejemplo, usted quiere añadir arcgis rest api response( esri json) a la capa de características

var search_layer_result = JSON.parse(data)

    console.log(search_layer_result)

   // ............ add esri json -> feature layer -> map  ..............

  var featureCollection = {  
                      layerDefinition : search_layer_result,  
                      featureSet : search_layer_result 
                      }; 

 search_result_featureLayer = new FeatureLayer(featureCollection);  
//var symbol = new SimpleMarkerSymbol().setColor(new esri.Color([255,0,0,0.5]));  
 var renderer = new SimpleRenderer(your_Symbol);  
 search_result_featureLayer.setRenderer(renderer);  

 map.addLayer(search_result_featureLayer, your_layer_index_optional);

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X