สามารถเข้าถึงภาษาของ SQL ผ่านเครื่องมือ ArcGIS ได้ในระดับใด


10

คำถามนั้นฟังดูซ้ำซ้อนมาก ... ไม่ว่าจะด้วยเหตุผล
ใดก็ตามฉันถูกขอให้สำรวจการใช้ SQL ใน ArcGIS เราใช้ SDE DB สำหรับการจัดเก็บด้านเซิร์ฟเวอร์และการจัดการฐานข้อมูล / การแก้ไขขนาดใหญ่ทั้งหมด อย่างไรก็ตามฉันพยายามที่จะเจาะลึกลงไปถึงวิธีที่ SQL รวมอยู่ในเครื่องมือของ ArcGIS มีหมายเหตุในคู่มืออ้างอิง SQL Queryของ ArcGIS 10 ที่ระบุว่าไวยากรณ์ SQL อย่างชัดเจนไม่ทำงานเมื่อใช้เครื่องมือ Field Calculator ฉันพบว่ามันน่าผิดหวังมากเพราะมันมีประโยชน์มากที่จะสามารถดึงและตัดข้อมูลจากฐานข้อมูลโดยตรงเมื่อทำการคำนวณค่าของฟิลด์

อะไรคือข้อ จำกัด และข้อผิดพลาดที่ใหญ่ที่สุดที่อาจเกิดขึ้นเมื่อพยายามใช้ประโยชน์จาก SQL ใน ArcGIS? เครื่องมือใดที่ใช้งานได้ดีที่สุดเมื่อรวมเข้ากับ SQL

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

หรือมันคืออะไร?


มีตารางสอบถามใด ๆ เป็นรุ่นหรือไม่
Michael ทอดด์

versioned? ฉันไม่คิดว่าฉันคุ้นเคยกับคำนั้น
นาธานุส

1
การกำหนดเวอร์ชันของเลเยอร์ช่วยให้สามารถทำการเปลี่ยนแปลงกับเลเยอร์ได้ในขณะที่ยังคงคุณลักษณะก่อนหน้า ดังนั้นหากสถานที่นั้นถูกลบไปแล้วเลเยอร์ปัจจุบันจะแสดงว่าสถานที่นั้นไม่มีอยู่อีกต่อไป อย่างไรก็ตามคุณลักษณะนี้ยังคงมีอยู่ในเลเยอร์ "ฐาน" และเครื่องมือ GIS สามารถใช้ดูเลเยอร์รุ่นต่าง ๆ ที่แสดงคุณลักษณะได้ คุณสามารถบอกได้ว่าเลเยอร์ของคุณนั้นเป็นเวอร์ชั่นหรือไม่โดยการคลิกขวาที่เลเยอร์ใน ArcCatalog และเลือกคุณสมบัติ ด้านล่างของแท็บทั่วไปมีส่วนที่เรียกว่าการกำหนดรุ่นและข้อมูลที่นี่จะบอกคุณว่าเลเยอร์นั้นเป็นรุ่นหรือไม่
Michael ทอดด์

คำตอบ:


9

ถ้าคุณต้องการใช้ Python ลองดูที่คำสั่งArcSDESQLExecute สิ่งนี้จะช่วยให้คุณสามารถรัน SQL โดยอำเภอใจได้ แต่จะต้องเชื่อมต่อผ่าน SDE หากผลลัพธ์ของแบบสอบถามเป็นชุดของแถวแอตทริบิวต์จะถูกส่งกลับเป็นรายการของ Python มิฉะนั้นจะส่งคืน True ถ้า SQL ดำเนินการสำเร็จหรือไม่มีถ้าไม่ ดูเพิ่มเติม: การเรียกใช้งาน SQL โดยใช้การเชื่อมต่อ ArcSDE


ฉันจะทำอย่างนั้น! ดูเหมือนว่าสิ่งที่ฉันกำลังมองหาในบริบทนี้ ขอบคุณมาก.
นาธานุส

5

หากคุณกำลังเขียน ArcObjects ที่กำหนดเองคุณสามารถดำเนินการ SQL โดยอำเภอใจกับ SDE Workspace โดยใช้วิธีExecuteSQL วิธีนี้ จำกัด เฉพาะการสืบค้นที่ไม่ส่งคืนชุดผลลัพธ์เช่น INSERT, UPDATE หรือบางขั้นตอนที่เก็บไว้

หากคุณทำงานผ่าน ArcMap UI ตัวเลือกของคุณจะมี จำกัด มากขึ้น สาเหตุที่คุณไม่สามารถใช้ SQL ผ่านเขตการคำนวณได้เนื่องจากนิพจน์นั้นเป็น VBScript และ / หรือ Python คุณสามารถใช้ VBScript หรือ Python เพื่อดำเนินการนิพจน์ SQL โดยพลการและดึงค่าจากเคอร์เซอร์ผลลัพธ์ แต่ฉันไม่แนะนำ

หรือคุณสามารถใช้คำตอบของ Reganและสร้าง Query Layer สำหรับข้อมูลแบบอ่านอย่างเดียวนี่เป็นวิธีที่ดีที่สุดของคุณ หากคุณต้องการอัปเดตข้อมูลมันซับซ้อนกว่าเล็กน้อย คุณจะต้องสร้างเลเยอร์แบบสอบถามด้วยค่า "ใหม่" ของคุณทำการเข้าร่วมกับตารางที่มีอยู่ของคุณแล้วใช้เขตข้อมูลการคำนวณ สิ่งนี้สามารถใช้ร่วมกับ ExecuteSQL เพื่อทำการอัพเดตที่ซับซ้อนแล้วดูผลลัพธ์ (ชนิดของ clunky)

ทางเลือกสุดท้ายของคุณคือการรัน SQL กับตาราง ArcSDE โดยตรง


1
จุดสุดท้ายของคุณ (การดำเนินการ SQL กับตารางโดยตรง) คือเหตุผลที่ฉันถามคำถามการกำหนดรุ่นของฉัน แบบสอบถาม SQL ที่ระดับฐานข้อมูลจะดึงจากชั้นฐานเท่านั้น (ยกเว้นกรณีที่ตั้งค่ามุมมองแบบหลายตัวแปร) ดังนั้นจะไม่ทำงานหากมีการกำหนดรุ่นชั้น
Michael ทอดด์

งานที่ฉันทำส่วนใหญ่เป็น Python แต่ดูเหมือนว่าการใช้งานจริงใน UI นั้นอาศัย ArcObjects มากขึ้นเรื่อย ๆ
นาธานุส

ทุกอย่างถูกสร้างขึ้นบน ArcObjects ภายในรวมถึงการทำงานของหลาม
James Schek

ถ้า ArcSDESQLExecute ใน Python สามารถส่งคืนผลลัพธ์ได้จะทำอย่างไรเหมือนกันผ่าน IWorkspaceExecuteSQL
Petr Krebs

@petr คุณไม่สามารถโดยตรงได้ ... ฉันได้อัปเดตคำตอบแล้ว
James Schek


1

ขึ้นอยู่กับว่าคุณใช้ RDBMS อะไรคุณสามารถใช้ประโยชน์จากไลบรารี SQL นอก ArcObjects หรือ arcpy ตราบใดที่คุณไม่ได้ขึ้นอยู่กับการรับข้อมูลคุณลักษณะกลับมา การสืบค้นจำนวนมากในฐานข้อมูล SQL Server ที่ฉันใช้เป็นประจำทุกวันนั้นไม่ใช่เชิงพื้นที่ดังนั้นฉันจะใช้คลาส System.Data ภายใน. NET หรือไลบรารี pymssql Python ภายในแอปพลิเคชัน Python หากคุณต้องการใช้ข้อมูล Spatial แล้ว Query Layers เป็นทางออกที่ดีที่สุดของคุณ ข้อแม้เท่านั้นที่มีเลเยอร์แบบสอบถามคือพวกเขาทำงานกับข้อมูลที่เก็บไว้โดยใช้ชนิดข้อมูลเชิงพื้นที่เท่านั้น (ไม่ใช่ประเภท SDEBINARY มาตรฐาน)


สิ่งนี้เริ่มรุนแรงขึ้น ฉันเดาว่าฉันต้องประเมินความต้องการของฉันอย่างระมัดระวังมากขึ้น ฉันจะไม่ต้องการข้อมูล "ปริภูมิ" หากคุณหมายถึงสิ่งต่าง ๆ เช่นรูปหลายเหลี่ยมและจุด / เส้นตัวเอง แต่เพียงค่าในฟิลด์ข้อความ / จำนวนเต็ม
นาธานุส

หากคุณต้องการส่งคืนชนิดรูปทรงเรขาคณิตฉันจะใช้การเข้าถึงข้อมูล ArcObjects / arcpy มาตรฐาน หากสิ่งที่คุณกำลังทำคือการเข้าถึงข้อมูล "ตาราง" (ไม่มีประเภทเชิงพื้นที่ที่เกี่ยวข้อง) เพียงแค่ทำการโทรฐานข้อมูลโดยใช้ SqlConnections ปกติ (สำหรับ SQL Server - ประเภทการเชื่อมต่อของคุณอาจแตกต่างกัน) ผลลัพธ์มีความยืดหยุ่นมากกว่าสิ่งที่คุณได้รับจาก ICursor ถ้าฉันเข้าใจคำถามของคุณและคุณถูก จำกัด ให้ใช้เครื่องคำนวณภาคสนามคุณจะไม่สามารถใช้ SQL ดิบได้
SagebrushGIS
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.