¿Cómo consultar todos los registros (> 1000) y exportar a csv?

13

Publiqué en el foro de arcgis pero nunca obtuve respuesta. ¿Alguien puede decirme cómo resolver esto?

Suponga que tiene un registro de seguimiento de vehículos del 1 de octubre al 31 de diciembre con información sobre la velocidad del viento. Todos los datos se guardan en la geodatabase (sde-sqlserver) y en ArcGIS Server 10.1 como capa de entidades. Un control deslizante de tiempo muestra las ubicaciones de un automóvil con velocidad del viento.

Cuando un usuario cambia un rango de tiempo (por ejemplo, del 2 de octubre al 4 de octubre), la primera tarea de consulta (para contar) calcula el número de características dentro del rango. Por lo general, hay más de 1000 resultados, incluso dos días (por ejemplo, 1750) (aunque no quiero cambiar este límite).

Utilicé otra tarea de consulta (executeforIds) para mantener todos los registros en la mano, pero reduje la cantidad con el módulo (1/10), que todavía es un número suficiente para hacer un buen gráfico para una tendencia general de la velocidad del viento. Sin embargo, también quiero proporcionar una opción para descargar un conjunto de datos completo en csv (en este caso, 1750 filas)

Aquí, usé findtask para recuperar el conjunto de datos de atributos dentro del rango de tiempo.

try {
    //console.log(app.objIDs);
    var attribs;
    csvdata = "";

    var find = new esri.tasks.FindTask("http://xyz.com/arcgis/rest/services/Realtime/Car_Wind_WM/MapServer");
    var params = new esri.tasks.FindParameters();
    params.layerIds = [0];
    params.searchFields = ["OBJECTID"];

    for (var i = 0; i < app.objIDs.length; i++) {
        params.searchText = app.objIDs[i];
        find.execute(params, function (results) {
            attribs = results[0].feature.attributes;
            csvdata += attribs.Date_Central + ',' + attribs.Longitude + "," + attribs.Latitude + "," + attribs.windspeed + "\n";
            console.log(csvdata); //1
        }, function (error) {
            alert("Error");
        });
    }
} catch (error) {
    alert("Change the time range first");
}
console.log(csvdata); //2
setTimeout(function () {
    formatData(app.csvdata);
}, (3 * 1000));

csvdata no estaba definido en console.log2, aunque todos los csvdata (en console.log1) muestran datos en la consola. El problema parece la sincronización de find.execute complete, así que agregué setTimeout.

Esto parece funcionar, pero cuando aumento el rango de tiempo, obviamente no lo hará.

¿Hay alguna forma de mantener todos los registros (1000 - 200,000) en un rango de tiempo específico y exportarlos a csv?

usuario14693
fuente

Respuestas:

6

Una de las opciones es hacer que el sistema le devuelva los registros. Le dará los números de registro para las 1750 filas, aunque solo devolverá los datos de 1000.

Cuando obtenga la lista de registros (no estoy seguro de si están ordenados) extraiga los primeros 1000, luego agregue el primer y último OBJECTID a la cláusula where

OBJECTID>=firstobjectid and  OBJECTID<=lastobjectid

repita tantas veces como sea necesario.

mhoran_psprep
fuente
6

Iba a sugerir usar QueryTask y establecer returnIdsOnly = true .

Tenga en cuenta que si bien hay un límite en el número de características incluidas en la respuesta del conjunto de características, no hay límite en el número de ID de objetos devueltos en la respuesta de matriz de ID. Los clientes pueden explotar esto para obtener todas las ID de objeto que cumplen con la consulta especificando returnIdsOnly = true y posteriormente solicitando conjuntos de características para subconjuntos de ID de objeto.

Esto se puede encontrar en la QueryTask de la API de Javascript .

También es compatible con la consulta de la API de Silverlight .

Si está utilizando tipos de datos espaciales del servidor SQL nativo, y no está utilizando el control de versiones, puede considerar escribir un servicio REST de Microsoft utilizando la plantilla como punto de partida.

Kirk Kuykendall
fuente
No me di cuenta de esto, ¡bien! En la primera línea, querías decir returnIdsOnly = verdadero ¿verdad?
awesomo
Vaya, eso es cierto, cambié mi respuesta ahora.
Kirk Kuykendall el
Gracias Kirk Conocía "returnIdsOnly = true" en la API de Sliverlight, pero no pude encontrar en la API de Javascript como mencionaste. Comprobaré el MS REST.
user14693
5
  1. Ciertamente, podría aumentar el límite de registro de servicio a 10k o más si se trata de puntos y atributos de pareja, especialmente si no está generando gráficos.

  2. Puede realizar una tarea de geoprocesamiento asíncrono y recoger los datos después de generados en una carpeta de salida en el servidor.

  3. Si lanza un pedido por cláusula y el tiempo en su consulta. Es posible que pueda leer la hora en el último registro y obtener el siguiente conjunto de registros mayor que esa hora. Continúe hasta llegar al final de su rango de tiempo.

awesomo
fuente