วิธีสอบถามข้อมูลทั้งหมด (> 1,000) และส่งออกเป็น csv?


13

ฉันโพสต์ในฟอรัม arcgis แต่ไม่เคยได้รับคำตอบใด ๆ มีใครบอกวิธีแก้ปัญหานี้ได้บ้าง

สมมติว่าคุณมีบันทึกการติดตามยานพาหนะตั้งแต่วันที่ 1 ตุลาคมถึง 31 ธันวาคมด้วยข้อมูลความเร็วลม ข้อมูลทั้งหมดจะถูกบันทึกในฐานข้อมูลภูมิศาสตร์ (sde-sqlserver) และสูงกว่าใน ArcGIS Server 10.1 เป็นเลเยอร์คุณลักษณะ แถบเลื่อนเวลาแสดงตำแหน่งของรถยนต์ด้วยความเร็วลม

เมื่อผู้ใช้เปลี่ยนช่วงเวลา (เช่น Oct.2 - Oct.4) งานแบบสอบถามแรก (สำหรับการนับ) คำนวณจำนวนของคุณสมบัติภายในช่วง โดยปกติจะมีผลลัพธ์มากกว่า 1,000 รายการถึงสองวัน (เช่น 1750) (ฉันไม่ต้องการเปลี่ยนขีด จำกัด นี้)

ฉันใช้งานแบบสอบถามอื่น (executeforIds) เพื่อเก็บบันทึกทั้งหมดไว้ในมือ แต่ลดจำนวนด้วยโมดูลัส (1/10) ซึ่งยังคงมีจำนวนเพียงพอสำหรับการทำแผนภูมิที่ดีสำหรับแนวโน้มโดยรวมของความเร็วลม อย่างไรก็ตามฉันต้องการให้ตัวเลือกในการดาวน์โหลดชุดข้อมูลทั้งหมดใน csv (ในกรณีนี้คือ 1,750 แถว)

ที่นี่ฉันใช้ 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

ดูเหมือนว่าจะใช้งานได้ แต่เมื่อฉันเพิ่มช่วงเวลามันจะไม่ชัด

อย่างไรก็ตามมีการเก็บบันทึกทั้งหมด (1,000 - 200,000) ในช่วงเวลาที่กำหนดและส่งออกไปยัง csv หรือไม่

คำตอบ:


6

หนึ่งในตัวเลือกคือให้ระบบส่งคืนระเบียนให้คุณ มันจะให้หมายเลขบันทึกสำหรับทุกแถว 1,750 แถวของคุณแม้ว่าจะส่งคืนข้อมูลเป็น 1,000 เท่านั้น

เมื่อคุณได้รับรายการของบันทึก (ฉันไม่แน่ใจว่าพวกเขาจะถูกจัดเรียง) ดึงออก 1,000 ครั้งแรกจากนั้นเพิ่ม OBJECTID แรกและครั้งสุดท้ายเพื่อ whereclause

OBJECTID>=firstobjectid and  OBJECTID<=lastobjectid

ทำซ้ำหลาย ๆ ครั้งตามที่จำเป็น


6

ผมจะแนะนำให้ใช้ QueryTask และการตั้งค่าreturnIdsOnly = true

โปรดทราบว่าในขณะที่มีข้อ จำกัด เกี่ยวกับจำนวนของคุณสมบัติที่รวมอยู่ในการตอบสนองชุดคุณลักษณะ แต่ไม่ จำกัด จำนวนของ ID วัตถุที่ส่งคืนในการตอบสนองอาร์เรย์ ID ลูกค้าสามารถใช้ประโยชน์จากสิ่งนี้เพื่อรับแบบสอบถามทั้งหมดที่สอดคล้องกับ ID วัตถุโดยระบุ returnIdsOnly = true และขอชุดคุณลักษณะที่ตามมาสำหรับชุดย่อยของ ID วัตถุ

นี้สามารถพบได้ในJavaScript API ที่ของ QueryTask

มันคือการสนับสนุนยังอยู่ในAPI Silverlight ของแบบสอบถาม

หากคุณกำลังใช้ประเภทข้อมูลเชิงพื้นที่ของเซิร์ฟเวอร์ SQL ดั้งเดิมและไม่ได้ใช้การกำหนดเวอร์ชันคุณอาจพิจารณาเพียงแค่เขียนบริการ Microsoft REST โดยใช้เทมเพลตเป็นจุดเริ่มต้น


ไม่ได้ตระหนักถึงสิ่งนี้ - ดี! ในบรรทัดแรกคุณหมายถึง returnIdsOnly = จริงใช่ไหม
awesomo

อ๊ะเป็นเรื่องจริงฉันเปลี่ยนคำตอบทันที
Kirk Kuykendall

ขอบคุณเคิร์ก ฉันรู้ว่า "returnIdsOnly = true" ใน Sliverlight API แต่ฉันไม่พบใน Javascript API ตามที่คุณพูดถึง ฉันจะตรวจสอบ MS REST
user14693

5
  1. แน่นอนคุณสามารถเพิ่มขีด จำกัด การบันทึกการบริการเป็น 10k หรือมากกว่านั้นถ้าคุณจัดการกับคะแนนและแอตทริบิวต์คู่ - โดยเฉพาะถ้าคุณไม่ได้สร้างกราฟิก

  2. คุณสามารถสร้างงานการประมวลผลทางภูมิศาสตร์แบบอะซิงโครนัสและรับข้อมูลหลังจากสร้างขึ้นในโฟลเดอร์เอาต์พุตบนเซิร์ฟเวอร์

  3. ถ้าคุณโยนถ้าสั่งซื้อตามข้อและเวลาในแบบสอบถามของคุณ คุณอาจจะสามารถอ่านเวลาในระเบียนสุดท้ายและรับชุดระเบียนถัดไปที่มากกว่าเวลานั้น ทำต่อไปจนกว่าจะถึงจุดสิ้นสุดของช่วงเวลา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.