1 votos

¿Creación de una capa consciente del tiempo (API de ArcGIS para JavaScript + ruby rails) utilizando datos del servidor?

Tengo un conjunto de datos de puntos. Cada punto tiene latitud, longitud, fecha y descripción enviados desde el servidor

Ya tengo una capa gráfica que se utiliza para representar los puntos de forma estática con algunos popups como esta

          ...
          var graphic = new esri.Graphic(point, symbol);

          graphic.setInfoTemplate(new esri.InfoTemplate("", "Number: " + data.number));

          gLayer.add(graphic);
          ...

Pero ahora necesito añadir una capa que tenga en cuenta el tiempo (una capa de características, creo) que me permita mostrar los datos de acuerdo con la información de la fecha y hora utilizando un deslizador de tiempo, como aquí [aceite Archivado][1]. La única diferencia, es que necesito usar los datos enviados desde el servidor como json y necesito añadir popups a cada punto

Creo que necesito añadir un featureLayer (MODE_SNAPSHOT) con un featureCollection como params que contenga los datos enviados desde el servidor pero no pude averiguar cómo hacer esto (soy un novato en ArcGis, varias horas solamente).

Para ser exactos no estoy seguro de cómo crear esa colección de características con latitud/longitud para cada punto y lo más importante: cómo conectarlo con la información de tiempo correspondiente

Es decir, tengo conjuntos de

{lat: xxx, long: yyy, datetime: yyyy-mm-dd, descripción: algún texto }

enviado desde el servidor

Ahora tengo que averiguar cómo pasar los datos a un featureLayer para que se pueda mostrar en un mapa con un deslizador de tiempo [1]: http://help.arcgis.com/en/webapi/javascript/arcgis/help/jssamples_start.htm#jssamples/time_slider_layerDef.html "Campo de petróleo"

2voto

wheleph Puntos 1106

Puede crear la capa de características a partir de JSON de la siguiente manera:

    {
       "layerDefinition": {
       "geometryType": "esriGeometryPoint",
       "objectIdField": "ObjectID",
       "drawingInfo": {
       "renderer": {
        "type": "simple",
        "label": "",
        "description": "",
        "symbol": {
            "color": [
                205,
                212,
                144
            ],
            "size": 8,
            "angle": 0,
            "xoffset": 0,
            "yoffset": 0,
            "type": "esriSMS",
            "style": "esriSLSSolid",
            "outline": {
                "color": [
                    205,
                    212,
                    144
                ],
                "width": 0,
                "type": "esriSLS",
                "style": "esriSLSolid"
            }
        }
    }
},
"fields": [
    {
        "name": "ObjectID",
        "alias": "ObjectID",
        "type": "esriFieldTypeOID"
    }, ...some more fields...
 ]
 },
"featureSet": {
"features": []
}

Para crear la capa de características, tendrás que pasar primero el JSON a una colección de características. Aquí hay un código de ejemplo:

    var spatialReference = new esri.SpatialReference({ wkid: 102100 });
    var featureCollection = JSON.parse(msg.d);
    var featureLayer = new esri.layers.FeatureLayer(featureCollection, {
           id: 'HourlyDataLayer',
           mode: esri.layers.FeatureLayer.MODE_SNAPSHOT
    });
    map.addLayers([featureLayer]);

A continuación, tendrá que bucle a través de las características para agregarlos a una matriz y añadir que a la capa de características. He descubierto que pasar las características con el resto del JSON para la colección de características no funciona. Ten en cuenta que applyEdits() no añadirá tus características a la capa a menos que hayas hecho primero map.addLayers([featureLayer]).

   var pointFeatures = [];
   for (var i = 0; i < features.length; i++) {
       var feature = features[i];
       var symbol = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE, 8,
    new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID,
    new dojo.Color([255, 0, 0]), 1), new dojo.Color([0, 255, 0, 0.25]));
       var geometry = new esri.geometry.Point(feature.longitude, feature.latitude, spatialReference);
       var graphic = new esri.Graphic(geometry, symbol);
       graphic.setInfoTemplate(infoTemplate);
       graphic.setAttributes(attr);
       pointFeatures.push(graphic);
   }

   featureLayer.applyEdits(pointFeatures, null, null);

El infoTemplate en ese código le dará una ventana emergente para cada punto, usted crea una plantilla de información personalizada como esta:

    var infoTemplate = new esri.InfoTemplate();

    infoTemplate.setTitle("Time Point");
    infoTemplate.setContent("<b>Attribute display: ${attribute field name}</b><br/>"

    + "<b>Another attribute: </b>${another field name}<br/>"

    + "<b>One more attribute: ${field name}</b>");

Donde "attribute field name" está en los atributos definidos para tus puntos y "Attribute display" es lo que quieres que se titule en el popup.

El único problema es que no sé cómo hacer funcionar la capa con el deslizador de tiempo, no he podido.

EDIT: Cuanto más intento hacer esto para mi propio proyecto, más me convenzo de que no se puede hacer. No parece haber ninguna manera de hacer que una capa de características de rodar-tu-propio tiempo consciente. Podrías lograr algo similar manejando el evento time-extent-change del timeSlider para personalizar la visualización de tus características, y he visto a un colega hacer eso en la API de Flex, pero no creo que sea muy receptivo si estás tratando con muchas características y muchas paradas de tiempo, como yo. Si alguien resuelve esto, ¡me encantaría saber que estoy equivocado!

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