Як запитувати всі записи (> 1000) та експортувати в CSV?


13

Я розміщував на форумі арггіс, але жодної відповіді не отримав. Хтось може сказати мені, як це вирішити?

Припустимо, у вас є записи про відстеження автомобіля з 1 жовтня по 31 грудня з інформацією про швидкість вітру. Всі дані зберігаються в базі даних геоданих (sde-sqlserver) та вище в ArcGIS Server 10.1 як функціональний рівень. Повзунок часу показує розташування автомобіля зі швидкістю вітру.

Коли користувач змінює часовий діапазон (наприклад, 2 жовтня - жовтень 4), перше завдання запиту (для підрахунку) обчислює кількість функцій у межах діапазону. Зазвичай за два дні є більше 1000 результатів (наприклад, 1750) (я не хочу змінювати цю межу).

Я використав ще одне завдання запиту (ExecuteforIds), щоб тримати всі записи в руці, але зменшити кількість за допомогою модуля (1/10), що ще є достатньою кількістю для створення приємної діаграми для загальної тенденції швидкості вітру. Однак я також хочу надати можливість завантажити цілий набір даних у форматі csv (в даному випадку 1750 рядків)

Тут я використовував findtask для отримання набору даних атрибутів у часовому діапазоні.

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 не визначено в console.log2, хоча всі csvdata (у console.log1) показують дані в консолі. Проблема здається, що термін find.execute завершений, тому я додав setTimeout.

Здається, це працює, але коли я збільшую часовий діапазон, очевидно, це не буде.

Чи все-таки потрібно зберігати всі записи (1000 - 200 000) у визначений часовий діапазон та експортувати до CSV?

Відповіді:


6

Одним із варіантів є надання системою повернення записів. Він дасть вам рекордні числа за всі 1750 рядків, навіть якщо він поверне дані лише для 1000.

Коли ви отримаєте список записів (я не впевнений, чи вони відсортовані), витягніть першу 1000, а потім додайте перший і останній ОБ'ЄКТИ до пункту декларування

OBJECTID>=firstobjectid and  OBJECTID<=lastobjectid

Повторіть стільки разів, скільки потрібно.


6

Я збирався запропонувати використовувати QueryTask і встановити returnIdsOnly = true .

Зауважте, що хоча існує обмеження на кількість функцій, включених у відповідь набору функцій, немає обмеження кількості ідентифікаторів об'єктів, повернутих у відповіді масиву ідентифікаторів. Клієнти можуть використовувати це для отримання всіх ідентифікаторів об'єкта, що відповідають запиту, вказавши returnIdsOnly = true та в подальшому запросивши набори функцій для підмножини ідентифікаторів об'єкта.

Це можна знайти у QueryTask Javascript api .

Він також підтримується в запиті API Silverlight .

Якщо ви використовуєте натурні просторові типи даних SQL-сервера, а не використовуєте версії, ви можете розглянути можливість просто написання послуги Microsoft REST, використовуючи шаблон як вихідну точку.


Не усвідомлював цього - приємно! У першому рядку ви мали на увазі returnIdsOnly = вірно, правда?
awesomo

На жаль, це правда, я змінив свою відповідь зараз.
Кірк Куйкендалл

Дякую, Кірк. Я знав "returnIdsOnly = true" в API Sliverlight, але не зміг знайти в JavaScript api, як ви згадували. Я перевірю MS REST.
користувач14693

5
  1. Ви, звичайно, можете збільшити ліміт записів на службу до 10 к або більше, якщо ви маєте справу з точками та атрибутами пари, особливо якщо ви не створюєте графіку.

  2. Ви можете зробити асинхронну задачу з геообробки та забрати дані після їх генерування у вихідній папці на сервері.

  3. Якщо ви кинете, якщо замовлення за пунктом і час у вашому запиті. Можливо, ви зможете прочитати час в останньому записі та отримати наступний набір записів, більший за цей час. Продовжуйте рухатися, поки не досягнете кінця свого часового діапазону.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.