Как запросить все записи (> 1000) и экспортировать в CSV?

13

Я написал на форуме Arcgis, но так и не получил ответа. Может кто-нибудь сказать мне, как это решить?

Предположим, у вас есть записи отслеживания транспортных средств с 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) показывают данные в консоли. Кажется, проблема с поиском завершена, так как я добавил setTimeout.

Кажется, это работает, но когда я увеличиваю временной диапазон, это явно не будет.

Есть ли возможность хранить все записи (от 1000 до 200 000) за определенный промежуток времени и экспортировать их в csv?

user14693
источник

Ответы:

6

Один из вариантов - система возвращает вам записи. Он выдаст вам номера записей для всех 1750 строк, даже если он вернет данные только для 1000.

Когда вы получите список записей (я не уверен, что они отсортированы) вытащите первую 1000, а затем добавьте первый и последний OBJECTID в предложение where

OBJECTID>=firstobjectid and  OBJECTID<=lastobjectid

Повторите столько раз, сколько необходимо.

mhoran_psprep
источник
6

Я собирался предложить использовать QueryTask и установить returnIdsOnly = true .

Обратите внимание, что, хотя существует ограничение на количество объектов, включенных в ответ набора функций, не существует ограничения на число идентификаторов объектов, возвращаемых в ответе массива идентификаторов. Клиенты могут использовать это для получения всех идентификаторов объектов, соответствующих запросу, указав returnIdsOnly = true и впоследствии запрашивая наборы функций для подмножеств идентификаторов объектов.

Это можно найти в QueryTask API-интерфейса Javascript .

Это также поддерживается в Запросе Silverlight API .

Если вы используете собственные пространственные типы данных сервера SQL и не используете управление версиями, вы можете просто написать службу Microsoft REST, используя шаблон в качестве отправной точки.

Кирк Куйкендалл
источник
Не понял этого - приятно! В первой строке вы имели в виду returnIdsOnly = true, верно?
awesomo
К сожалению, это правда, я изменил свой ответ сейчас.
Кирк Куйкендалл
Спасибо, Кирк. Я знал «returnIdsOnly = true» в Sliverlight API, но я не смог найти в Javascript API, как вы упомянули. Я проверю MS REST вне.
user14693
5
  1. Конечно, вы можете увеличить лимит записей службы до 10 000 или более, если вы имеете дело с точками и парными атрибутами, особенно если вы не генерируете графику.

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

  3. Если вы бросите, если порядок по пункту и время в вашем запросе. Возможно, вы сможете прочитать время в последней записи и получить следующий набор записей больше, чем это время. Продолжайте, пока не достигнете конца своего временного диапазона.

шикарн-о
источник