すべてのレコード(> 1000)をクエリし、csvにエクスポートする方法は?


13

arcgisフォーラムに投稿しましたが、回答がありませんでした。誰もこれを解決する方法を教えてもらえますか?

10月1日から12月31日までの風速情報を含む車両追跡記録があるとします。すべてのデータはジオデータベース(sde-sqlserver)に保存され、フィーチャレイヤーとしてArcGIS Server 10.1に保存されます。タイムスライダーは、車の位置を風速で表示します。

ユーザーが時間範囲(たとえば、10月2日から10月4日)を変更すると、最初のクエリタスク(カウント用)が範囲内のフィーチャの数を計算します。通常、2日(例:1750)でも1000を超える結果があります(ただし、この制限を変更したくありません)。

別のクエリタスク(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));

console.log2では、csvdataは未定義でしたが、すべてのcsvdata(console.log1内)はコンソールにデータを表示します。この問題は、find.executeのタイミングが完了したように見えるため、setTimeoutを追加しました。

これは動作しているように見えますが、時間範囲を広げると、明らかになりません。

とにかく特定の時間範囲ですべてのレコード(1000〜200,000)を保持し、csvにエクスポートする方法はありますか?

回答:


6

オプションの1つは、システムにレコードを返させることです。1000のデータのみを返す場合でも、1750行すべてのレコード番号が表示されます。

レコードのリストを取得したら(ソートされているかどうかわかりません)、最初の1000を取り出し、最初と最後のOBJECTIDをwhereclauseに追加します

OBJECTID>=firstobjectid and  OBJECTID<=lastobjectid

必要な回数だけ繰り返します。


6

QueryTaskを使用してreturnIdsOnly = trueを設定することをお勧めします

機能セットレスポンスに含まれる機能の数には制限がありますが、ID配列レスポンスで返されるオブジェクトIDの数には制限がないことに注意してください。クライアントはこれを利用して、returnIdsOnly = trueを指定し、その後オブジェクトIDのサブセットの機能セットを要求することで、オブジェクトIDに準拠するすべてのクエリを取得できます。

これは、Javascript APIのQueryTaskにあります。

Silverlight APIのQueryでもサポートされています

バージョン管理を使用せずに、ネイティブSQLサーバーの空間データ型を使用している場合は、開始点としてテンプレートを使用し Microsoft RESTサービスを記述することを検討できます。


これに気づかなかった-いいね!最初の行では、returnIdsOnly = trueを意味しましたか?
-awesomo

おっと、それは本当です、私は今私の答えを変えました。
カーククイケンドール

カークありがとうございます。Sliverlight APIで「returnIdsOnly = true」を知っていましたが、あなたが言ったようにJavascript APIで見つけることができませんでした。MS RESTをチェックアウトします。
user14693

5
  1. 特にグラフィックスを生成していない場合は、ポイントとカップルの属性を扱っている場合、サービスレコードの制限を10k以上に増やすことができます。

  2. 非同期ジオプロセシングタスクを作成し、サーバー上の出力フォルダーで生成された後にデータを取得できます。

  3. order by句とクエリ内の時間をスローする場合。最後のレコードの時間を読み取り、その時間より大きい次のレコードのセットを取得できる場合があります。時間範囲の終わりに達するまで続けてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.