Wie kann ich alle Datensätze abfragen (> 1000) und in eine CSV exportieren?

13

Ich habe im arcgis-Forum gepostet, aber keine Antwort bekommen. Kann mir jemand sagen, wie man das löst?

Angenommen, Sie haben einen Fahrzeug-Tracking-Datensatz vom 1. Oktober bis 31. Dezember mit Windgeschwindigkeitsinformationen. Alle Daten werden in der Geodatabase (sde-sqlserver) und in ArcGIS Server 10.1 als Feature-Layer gespeichert. Ein Zeitschieberegler zeigt die Positionen eines Autos mit Windgeschwindigkeit an.

Wenn ein Benutzer einen Zeitbereich ändert (z. B. 2. Oktober - 4. Oktober), berechnet die erste Abfrageaufgabe (für die Zählung) die Anzahl der Features innerhalb des Bereichs. Es gibt normalerweise mehr als 1000 Ergebnisse, sogar zwei Tage (z. B. 1750) (ich möchte dieses Limit jedoch nicht ändern).

Ich habe eine andere Abfragetask (executeforIds) verwendet, um alle Aufzeichnungen in der Hand zu halten, aber den Betrag mit dem Modul (1/10) zu reduzieren, der immer noch ausreicht, um ein schönes Diagramm für einen allgemeinen Trend der Windgeschwindigkeit zu erstellen. Ich möchte jedoch auch eine Option zum Herunterladen eines gesamten Datensatzes in csv (in diesem Fall 1750 Zeilen) bereitstellen.

Hier habe ich findtask verwendet, um einen Attributdatensatz innerhalb des Zeitbereichs abzurufen.

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 war in console.log2 undefiniert, obwohl alle csvdata (in console.log1) Daten in console anzeigen. Das Problem scheint das Timing von find.execute abgeschlossen zu haben, also habe ich setTimeout hinzugefügt.

Das scheint zu funktionieren, aber wenn ich die Zeitspanne erhöhe, wird es nicht offensichtlich.

Gibt es überhaupt eine Möglichkeit, alle Aufzeichnungen (1000 - 200.000) in einem bestimmten Zeitraum zu speichern und nach csv zu exportieren?

user14693
quelle

Antworten:

6

Eine der Optionen besteht darin, dass das System die Datensätze an Sie zurücksendet. Sie erhalten die Datensatznummern für alle 1750 Zeilen, obwohl nur die Daten für 1000 Zeilen zurückgegeben werden.

Wenn Sie die Liste der Datensätze erhalten (ich bin nicht sicher, ob sie sortiert sind), ziehen Sie die ersten 1000 heraus und fügen Sie die ersten und letzten OBJECTIDs zum whereclause hinzu

OBJECTID>=firstobjectid and  OBJECTID<=lastobjectid

Wiederholen Sie dies so oft wie nötig.

mhoran_psprep
quelle
6

Ich wollte vorschlagen, die QueryTask zu verwenden und returnIdsOnly = true zu setzen .

Beachten Sie, dass die Anzahl der Features, die in der Feature-Set-Antwort enthalten sind, begrenzt ist, die Anzahl der in der ID-Array-Antwort zurückgegebenen Objekt-IDs jedoch unbegrenzt ist. Clients können dies ausnutzen, um alle abfragekonformen Objekt-IDs abzurufen, indem sie returnIdsOnly = true angeben und anschließend Feature-Sets für Teilmengen von Objekt-IDs anfordern.

Dies kann in der JavaScript-API QueryTask gefunden werden .

Es wird auch in der Abfrage der Silverlight-API unterstützt .

Wenn Sie native räumliche SQL Server-Datentypen verwenden und keine Versionierung verwenden, sollten Sie möglicherweise nur einen Microsoft REST-Dienst schreiben, der die Vorlage als Ausgangspunkt verwendet.

Kirk Kuykendall
quelle
Das habe ich nicht gemerkt - schön! In der ersten Zeile meinten Sie returnIdsOnly = true, oder?
Awesomo
Hoppla, das stimmt, ich habe meine Antwort jetzt geändert.
Kirk Kuykendall
Vielen Dank, Kirk. Ich kannte "returnIdsOnly = true" in der Sliverlight-API, konnte aber, wie Sie bereits erwähnt haben, keine JavaScript-API finden. Ich werde die MS REST auschecken.
user14693
5
  1. Sie können das Serviceaufzeichnungslimit auf 10.000 oder mehr erhöhen, wenn Sie mit Punkten und Paarattributen arbeiten - insbesondere, wenn Sie keine Grafiken generieren.

  2. Sie können eine asynchrone Geoverarbeitungsaufgabe ausführen und die Daten abrufen, nachdem sie in einem Ausgabeordner auf dem Server generiert wurden.

  3. Wenn Sie eine Bestellung per Klausel und die Zeit in Ihre Anfrage werfen. Möglicherweise können Sie die Zeit im letzten Datensatz ablesen und die nächsten Datensätze abrufen, die größer als diese Zeit sind. Fahren Sie fort, bis Sie das Ende Ihrer Zeitspanne erreicht haben.

awesomo
quelle