Jak wysłać zapytanie do wszystkich rekordów (> 1000) i wyeksportować do pliku csv?

13

Napisałem na forum arcgis, ale nigdy nie otrzymałem żadnej odpowiedzi. Czy ktoś może mi powiedzieć, jak to rozwiązać?

Załóżmy, że masz zapisy śledzenia pojazdu od 1 października do 31 grudnia z informacjami o prędkości wiatru. Wszystkie dane są zapisywane w geobazie (sde-sqlserver) i wyżej w ArcGIS Server 10.1 jako warstwa obiektów. Suwak czasu pokazuje położenie samochodu z prędkością wiatru.

Gdy użytkownik zmieni zakres czasu (np. 2 października - 4 października), pierwsze zapytanie (dla liczby) oblicz liczbę funkcji w tym zakresie. Zwykle jest więcej niż 1000 wyników, nawet dwa dni (np. 1750) (chociaż nie chcę zmieniać tego limitu).

Użyłem innego zadania zapytania (executeforIds), aby zachować wszystkie rekordy pod ręką, ale zmniejszyłem liczbę za pomocą modułu (1/10), który wciąż jest wystarczającą liczbą do stworzenia ładnego wykresu dla ogólnego trendu prędkości wiatru. Jednak chcę również zapewnić opcję pobrania całego zestawu danych w pliku csv (w tym przypadku 1750 wierszy)

Tutaj użyłem findtask do pobrania zestawu danych atrybutów w przedziale czasowym.

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));

Plik csvdata nie został zdefiniowany w pliku console.log2, chociaż wszystkie csvdata (w pliku console.log1) pokazują dane w konsoli. Wydaje się, że problem został zakończony po zakończeniu find.execute, więc dodałem setTimeout.

To wydaje się działać, ale kiedy zwiększę zakres czasowy, to oczywiście nie będzie.

Czy w ogóle można przechowywać wszystkie rekordy (1000–200 000) w określonym przedziale czasowym i eksportować do pliku csv?

użytkownik14693
źródło

Odpowiedzi:

6

Jedną z opcji jest zwrócenie rekordów do systemu. Da ci numery rekordów dla wszystkich 1750 wierszy, nawet jeśli zwróci dane tylko dla 1000.

Kiedy pojawi się lista rekordów (nie jestem pewien, czy są posortowane) wyciągnij pierwsze 1000, a następnie dodaj pierwszy i ostatni OBJECTID do instrukcji

OBJECTID>=firstobjectid and  OBJECTID<=lastobjectid

Powtórz tyle razy, ile to konieczne.

mhoran_psprep
źródło
6

Chciałem zasugerować użycie QueryTask i ustawienie returnIdsOnly = true .

Należy zauważyć, że chociaż istnieje ograniczenie liczby funkcji zawartych w odpowiedzi zestawu funkcji, nie ma ograniczenia liczby identyfikatorów obiektów zwracanych w odpowiedzi tablicy ID. Klienci mogą to wykorzystać, aby uzyskać wszystkie identyfikatory obiektów zgodne z zapytaniem, określając returnIdsOnly = true, a następnie żądając zestawów funkcji dla podzbiorów identyfikatorów obiektów.

Można to znaleźć w QueryTask interfejsu API JavaScript .

Jest także obsługiwany w zapytaniu API Silverlight .

Jeśli używasz rodzimych typów danych przestrzennych serwera SQL i nie używasz wersji, możesz rozważyć napisanie usługi Microsoft REST przy użyciu szablonu jako punktu początkowego.

Kirk Kuykendall
źródło
Nie zdawałem sobie z tego sprawy - miło! W pierwszym wierszu miałeś na myśli returnIdsOnly = true, prawda?
awesomo
Ups, to prawda, zmieniłem teraz swoją odpowiedź.
Kirk Kuykendall
Dziękuję Kirk. Znałem „returnIdsOnly = true” w Sliverlight API, ale nie mogłem znaleźć w API JavaScript, jak wspomniałeś. Sprawdzę MS REST.
user14693,
5
  1. Z pewnością możesz zwiększyć limit rekordów usług do 10k lub więcej, jeśli masz do czynienia z punktami i parami atrybutów - szczególnie jeśli nie generujesz grafiki.

  2. Możesz wykonać asynchroniczne zadanie geoprzetwarzania i odebrać dane po wygenerowaniu w folderze wyjściowym na serwerze.

  3. Jeśli rzucisz, jeśli zamówienie według klauzuli i czas w zapytaniu. Być może będziesz w stanie odczytać czas z ostatniego rekordu i uzyskać następny zestaw rekordów większy niż ten czas. Idź dalej, aż dotrzesz do końca zakresu czasu.

awesomo
źródło