Come interrogare tutti i record (> 1000) ed esportarli in CSV?


13

Ho pubblicato nel forum arcgis ma non ho mai avuto risposta. Qualcuno può dirmi come risolverlo?

Supponiamo di avere una documentazione relativa al rilevamento dei veicoli dal 1 ° ottobre al 31 dicembre con informazioni sulla velocità del vento. Tutti i dati vengono salvati in geodatabase (sde-sqlserver) e fino in ArcGIS Server 10.1 come feature layer. Un dispositivo di scorrimento temporale mostra le posizioni di un'auto con la velocità del vento.

Quando un utente modifica un intervallo di tempo (ad es. 2 ottobre - 4 ottobre), la prima attività di query (per conteggio) calcola il numero di funzioni all'interno dell'intervallo. Di solito ci sono più di 1000 risultati anche due giorni (es. 1750) (non voglio cambiare questo limite però).

Ho usato un'altra attività di query (executeforIds) per tenere a portata di mano tutti i record ma ridurre la quantità con modulo (1/10) che è ancora un numero sufficiente per creare un bel grafico per un andamento generale della velocità del vento. Tuttavia, voglio anche fornire un'opzione per scaricare un intero set di dati in CSV (in questo caso 1750 righe)

Qui, ho usato findtask per recuperare il set di dati degli attributi all'interno dell'intervallo di tempo.

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 non era definito su console.log2, sebbene tutti csvdata (in console.log1) mostrino i dati nella console. Il problema sembra che i tempi di find.execute siano completi, quindi ho aggiunto setTimeout.

Questo sembra funzionare ma quando aumento l'intervallo di tempo, ovviamente non lo farà.

Esiste un modo per conservare tutti i record (1000 - 200.000) in un intervallo di tempo specifico ed esportarli in CSV?

Risposte:


6

Una delle opzioni è che il sistema ti restituisca i record. Ti fornirà i numeri di record per tutte le 1750 righe anche se restituirà i dati solo per 1000.

Quando si ottiene l'elenco dei record (non sono sicuro che siano ordinati), estrarre i primi 1000, quindi aggiungere il primo e l'ultimo OBJECTID al percorso

OBJECTID>=firstobjectid and  OBJECTID<=lastobjectid

Ripeti tutte le volte che è necessario.


6

Stavo per suggerire di usare QueryTask e impostare returnIdsOnly = true .

Si noti che mentre esiste un limite al numero di funzioni incluse nella risposta del set di funzioni, non esiste un limite al numero di ID oggetto restituiti nella risposta dell'array ID. I client possono sfruttarlo per ottenere tutti gli ID oggetto conformi alla query specificando returnIdsOnly = true e successivamente richiedendo set di funzionalità per sottoinsiemi di ID oggetto.

Questo può essere trovato nel QueryTask di API di Javascript .

È inoltre supportato nella query dell'API Silverlight .

Se si utilizzano tipi di dati spaziali del server SQL nativo e non si utilizza il controllo delle versioni, è possibile prendere semplicemente in considerazione la scrittura di un servizio Microsoft REST utilizzando il modello come punto di partenza.


Non me ne sono reso conto - bello! Nella prima riga intendevi returnIdsOnly = true vero?
awesomo,

Oops, è vero, ho cambiato la mia risposta ora.
Kirk Kuykendall,

Grazie Kirk. Conoscevo "returnIdsOnly = true" nell'API Sliverlight ma non riuscivo a trovare l'API Javascript come hai menzionato. Controllerò il MS REST.
user14693

5
  1. Potresti certamente aumentare il limite dei record di servizio a 10k o più se hai a che fare con punti e attributi di coppia, in particolare se non stai generando elementi grafici.

  2. È possibile eseguire un'attività di geoprocessing asincrona e raccogliere i dati dopo averli generati in una cartella di output sul server.

  3. Se si lancia se un ordine per clausola e il tempo nella query. Potresti essere in grado di leggere l'ora nell'ultimo record e ottenere il set di record successivo maggiore di quel tempo. Continua fino a quando non raggiungi la fine del tuo intervallo di tempo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.