เลือกค่าที่แตกต่างจากคอลัมน์เดียวของตารางแอตทริบิวต์ (หรือเลเยอร์)


16

มีวิธีการเลือกค่าที่แตกต่างจากคอลัมน์ใน ArcMap หรือไม่? ฉันมีข้อมูลทั้งในรูปแบบ GDB และ SHP ฉันค้นหาวิธีเลือกโดยใช้ SQL, QueryLayers, ModelBuilder และกล่องเครื่องมือแต่ละรายการและปรากฏเป็นตัวเลือกการเลือกทั้งหมดเสมอเลือก * จาก tableName WHERE ...

ใน SQL ฉันจะเขียนเลือก DISTINCT columnName จาก tableName

คำตอบ:


17

หรือคุณสามารถเรียกใช้เครื่องมือ ArcToolBox ความถี่ (เครื่องมือวิเคราะห์ >> สถิติ >> ความถี่) ซึ่งจะแสดงผลตารางที่มีค่าที่ไม่ซ้ำกันและจำนวนครั้งที่ปรากฏ

หรือคุณสามารถเขียนสคริปต์ไพ ธ อนที่ได้รับ SearchCursor บนฟิลด์จากนั้นสร้างรายการค่าทั้งหมดของแบบฟอร์ม

if value not in myList:
    myList.append(value)

3
หากคุณไม่มีใบอนุญาต ArcInfo ให้ใช้กล่องเครื่องมือนี้ (ทดสอบกับ

3
น่าประหลาดใจที่มีฟังก์ชั่นจำนวนมากที่ครั้งหนึ่งเคยต้องการฟังก์ชั่น ArcInfo สามารถนำไปใช้งานได้โดยใช้รหัส / โมดูล Python ที่ค่อนข้างง่าย มันยอดเยี่ยมมาก!
RyanKDalton-OffTheGridMaps

ขอบคุณแดนที่ใช้กลอุบาย ใบอนุญาตของฉันไม่รองรับกล่องเครื่องมือความถี่
Steve

12

ใช้ Python list comprehension

import arcpy
fldName = 'val_fld'
fcName = 'feature_class.shp'
#set creates a unique value iterator from the value field
myList = set([row.getValue(fldName) for row in arcpy.SearchCursor(fcName)]) 

สำหรับชุดข้อมูลขนาดใหญ่วิธีที่มีประสิทธิภาพของหน่วยความจำจะใช้นิพจน์ตัวสร้าง

myList = set((row.getValue(fldName) for row in arcpy.SearchCursor(fcName,fields=fldName))

1
เนื่องจากคุณสนใจเพียงหนึ่งสาขาเพื่อประสิทธิภาพที่ดีขึ้นฉันจะระบุfieldsอาร์กิวเมนต์ที่เป็นตัวเลือกเช่นmyList = set([row.getValue(fldName) for row in arcpy.SearchCursor(fcName, fields=fldName)])
blah238

ความคิดที่ดี. ฉันอยากรู้อยากเห็นเพื่อทดสอบความแตกต่างของประสิทธิภาพ สำหรับแหล่งข้อมูล SDE นั้นมีความสำคัญ แต่สำหรับรูปร่างไฟล์และฐานข้อมูลทางภูมิศาสตร์ของไฟล์ฉันจะแปลกใจถ้าเห็นคุณค่า
tharen

มันเยี่ยมมาก ฉันมีลิงก์ที่แสดงสิ่งนี้ได้ดี แต่มันพังได้หนึ่งวัน หวังว่าจะมีสิ่งนี้มาเป็นเวลานานนะ
Justin

4

หากข้อมูลของคุณอยู่ในรูปแบบ PGDB คุณสามารถทำสิ่งต่อไปนี้ในกล่องโต้ตอบตัวสร้างแบบสอบถาม (แบบสอบถามแบบใช้คำนิยามเลือกตามคุณสมบัตินิพจน์กล่องเครื่องมือ ฯลฯ ) โดยใช้แบบสอบถามย่อย:

SELECT * จากชื่อตารางที่ไหน ...

column_to_test_for_unique_values IN 
(SELECT column_to_test_for_unique_values
FROM table_name
GROUP BY column_to_test_for_unique_values HAVING
Count(column_to_test_for_unique_values)=1)

สิ่งนี้จะส่งกลับระเบียนที่ค่าในคอลัมน์ _to_test_for_unique_values ​​เป็นค่าเฉพาะ


1
คุณยังสามารถใช้ DISTINCT บน Geodatabase ส่วนบุคคลได้
Jakub Sisak GeoGraphics

4

หากคุณมีสิทธิ์ใช้งานแบบพื้นฐาน (ก่อนหน้านี้เรียกว่า ArcView) คุณสามารถเปิดมุมมองตารางคลิกขวาที่คอลัมน์และเลือกสรุป


ขอบคุณ ใช้งานได้ แต่ฉันไม่สามารถคัดลอกรายการนอกหน้าต่างได้!
Steve


1

หากข้อมูลของคุณอยู่ใน SDE (เอ็นจินฐานข้อมูลเชิงพื้นที่) เราสามารถใช้ออบเจ็กต์ ArcSDESQLExecute ของไพ ธ อนและอาร์คีของ หนึ่งสามารถผ่านซับซ้อน sql โดยใช้ "วิธีการนี้"

# set up executor for sql
executor = arcpy.ArcSDESQLExecute(sde_connection_sql)

# sql statements
select_max = """select max(LOAD_ID) from SDE.FEATURE_CLASS"""

# get load id
result_max_id = executor.execute(select_max)

0

หรือใช้สคริปต์ Python ของคุณเพื่อส่งออกเป็น CSV แล้วใช้ Python API ของฐานข้อมูลอื่น (พูด SpatiaLite) เพื่ออ่าน csv และทำการสืบค้น SQL ที่เหมาะสมจากสคริปต์เดียวกัน สำหรับตารางขนาดใหญ่อาจเร็วกว่าการสร้างตัวสร้างรายการของคุณเอง - ดันโน

อย่างไรก็ตามคุณก็ยังคงเป็น "คุณสมบัติ" ที่น่ารำคาญของ ArcGIS


0

สิ่งที่เกี่ยวกับการใช้distinctในแบบสอบถามย่อย (ต่อไปนี้อยู่ในชั้นเรียน FGDB):

"STATE_NAME" = (select distinct "STATE_NAME" from EsriUsaCountiesDetailed)

โปรดทราบจากความช่วยเหลือ (10.0) ว่าสิ่งนี้มีข้อ จำกัด :

การครอบคลุมรูปร่างและแหล่งข้อมูลที่อิงกับไฟล์ฐานข้อมูลอื่นไม่สนับสนุนเคียวรีย่อย


2
"DISTINCT" ใช้งานได้เฉพาะกับ Personal GDB ไม่ใช่ไฟล์ GDB
Jakub Sisak GeoGraphics

0

อย่างที่จัสตินแนะนำ ปกติแล้วฉันจะทำการสรุปบนฟิลด์ที่ฉันต้องการจากนั้นทำการเลือกที่แตกต่างกันบน dbf รันการคำนวณเล็กน้อยเพื่อจัดหมวดหมู่ค่าที่แตกต่างแต่ละค่าจากนั้นเข้าร่วมกลับไปที่เดิม
มันเป็นเส้นทางที่ยาวไกลและคุณต้องทำเฟนาเจลด้วยวิธีการคำนวณที่คุณชื่นชอบ แต่ ...
อะไรก็ตามที่ทำให้งานสำเร็จ

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