모든 레코드를 쿼리 (> 1000)하고 CSV로 내보내는 방법은 무엇입니까?


13

arcgis 포럼에 게시했지만 아무런 대답도 얻지 못했습니다. 누구든지 이것을 해결하는 방법을 말해 줄 수 있습니까?

풍속 정보가있는 차량 추적 기록이 10 월 1 일부터 12 월 31 일로 가정합니다. 모든 데이터는 지오 데이터베이스 (sde-sqlserver)에 저장되고 ArcGIS Server 10.1에 피처 레이어로 저장됩니다. 시간 슬라이더는 풍속이있는 자동차의 위치를 ​​보여줍니다.

사용자가 시간 범위를 변경하면 (예 : 10 월 2 일-10 월 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에 정의되어 있지 않지만 console.log1의 모든 csvdata는 콘솔에 데이터를 표시합니다. 문제는 find.execute의 타이밍이 완료된 것으로 보이므로 setTimeout을 추가했습니다.

이것은 작동하는 것처럼 보이지만 시간 범위를 늘리면 분명히 그렇지 않습니다.

어쨌든 모든 레코드 (1000-200,000)를 특정 시간 범위로 유지하고 CSV로 내보내는 것이 있습니까?

답변:


6

옵션 중 하나는 시스템이 레코드를 사용자에게 반환하도록하는 것입니다. 1000의 데이터 만 리턴하더라도 1750 개의 행에 대한 레코드 번호를 제공합니다.

레코드 목록을 가져 오면 (정렬되었는지 확실하지 않은 경우) 처음 1000 개를 가져온 다음 whereclause에 첫 번째 및 마지막 OBJECTID를 추가하십시오.

OBJECTID>=firstobjectid and  OBJECTID<=lastobjectid

필요한만큼 반복하십시오.


6

QueryTask를 사용하고 returnIdsOnly = true 설정하는 것이 좋습니다 .

기능 세트 응답에 포함 된 기능 수에는 제한이 있지만 ID 배열 응답에 리턴 된 오브젝트 ID 수에는 제한이 없습니다. 클라이언트는이를 활용하여 returnIdsOnly = true를 지정하고 이후에 오브젝트 ID의 서브 세트에 대한 기능 세트를 요청하여 모든 쿼리 준수 오브젝트 ID를 가져옵니다.

이것은 Javascript api의 QueryTask 에서 찾을 수 있습니다 .

Silverlight API의 Query 에서도 지원됩니다 .

기본 SQL Server 공간 데이터 유형을 사용하고 버전 관리를 사용하지 않는 경우 템플릿 을 시작점으로 사용하여 Microsoft REST 서비스를 작성하는 것을 고려할 수 있습니다 .


이것을 몰랐다 – 멋지다! 첫 번째 줄에서 returnIdsOnly = true를 의미 했습니까?
awesomo

죄송합니다. 지금 답변을 변경했습니다.
Kirk Kuykendall

커크 감사합니다. 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.