Chọn các giá trị riêng biệt từ một cột duy nhất của bảng thuộc tính (hoặc lớp)


16

Có cách nào để chọn các giá trị khác biệt từ một cột trong ArcMap không? Tôi có dữ liệu ở cả hai định dạng GDB và SHP. Tôi đã tìm kiếm các cách để chọn bằng SQL, QueryLayers, ModelBuilder và các hộp công cụ riêng lẻ và nó xuất hiện vì tất cả các tùy chọn lựa chọn luôn CHỌN * TỪ tên bảng WHERE ...

Trong SQL, tôi sẽ viết CHỌN cột DISTINCT TỪ tên bảng.

Câu trả lời:


17

Hoặc bạn có thể chạy Tần số công cụ ArcToolBox (Công cụ phân tích >> Thống kê >> Tần suất) sẽ xuất ra một bảng có các giá trị duy nhất và đếm số lần chúng xuất hiện.

Hoặc bạn có thể viết tập lệnh python lấy SearchCoder trên một trường sau đó xây dựng danh sách tất cả các giá trị của biểu mẫu

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

3
Nếu bạn không có một giấy phép ArcInfo sau đó sử dụng hộp công cụ này (thử nghiệm trên shapefile chỉ) resources.arcgis.com/gallery/file/geoprocessing/...

3
Thật đáng ngạc nhiên là có bao nhiêu hàm từng yêu cầu một hàm ArcInfo có thể được triển khai bằng cách sử dụng một số mã / mô-đun Python khá đơn giản. Thật tuyệt vời!
RyanKDalton-OffTheGridMaps

Cảm ơn Dan, đã làm điều đó. Giấy phép của tôi không hỗ trợ hộp công cụ Tần số.
Steve

12

Sử dụng một sự hiểu biết danh sách Python.

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)]) 

Đối với các bộ dữ liệu lớn, phương pháp hiệu quả bộ nhớ sẽ là sử dụng biểu thức trình tạo .

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

1
Vì bạn chỉ quan tâm đến một lĩnh vực, cho hiệu suất tốt hơn tôi sẽ chỉ định các tùy chọn fieldstham số, ví dụ:myList = set([row.getValue(fldName) for row in arcpy.SearchCursor(fcName, fields=fldName)])
blah238

Ý tưởng tốt. Tôi tò mò muốn kiểm tra sự khác biệt hiệu suất. Đối với các nguồn dữ liệu SDE, điều đó có thể có ý nghĩa, nhưng đối với các shapefile và tệp cơ sở dữ liệu địa lý cơ sở dữ liệu tôi sẽ ngạc nhiên nếu được đánh giá cao.
tharen

Điều đó thật tuyệt. Tôi đã có một liên kết cho thấy điều này độc đáo nhưng nó đã phá vỡ một ngày. Hy vọng se sẽ có điều này trong một thời gian dài tốt đẹp.
Justin

4

Nếu dữ liệu của bạn ở định dạng PGDB, bạn có thể thực hiện các thao tác sau trong hộp thoại trình tạo truy vấn (truy vấn định nghĩa, chọn theo thuộc tính, biểu thức hộp công cụ, v.v.) bằng cách sử dụng truy vấn con:

CHỌN * TỪ tên bảng Ở ĐÂU ...

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)

Điều này sẽ trả về các bản ghi mà các giá trị trong cột_to_test_for_unique_values ​​là duy nhất.


1
Bạn cũng có thể sử dụng DISTINCT trên Cơ sở dữ liệu địa lý cá nhân.
Jakub Sisak GeoGraphics

4

Nếu bạn chỉ có giấy phép Cơ bản (trước đây gọi là ArcView), bạn có thể mở chế độ xem Bảng, bấm chuột phải vào cột và chọn Tóm tắt.


Cảm ơn. Điều này đã làm việc, nhưng sau đó tôi không thể sao chép danh sách ra khỏi cửa sổ!
Steve


1

Nếu dữ liệu của bạn nằm trong SDE (công cụ cơ sở dữ liệu không gian), người ta có thể sử dụng đối tượng ArcSDESQLExecute của python và arcpy. Người ta có thể vượt qua sql phức tạp bằng cách sử dụng "phương pháp" này.

# 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

Hoặc sử dụng tập lệnh Python của bạn để xuất sang CSV và sau đó sử dụng API Python của cơ sở dữ liệu khác (giả sử SpatiaLite) để đọc csv và thực hiện truy vấn SQL thích hợp trên cùng một tập lệnh. Đối với một bảng lớn, điều này thể nhanh hơn một chút so với việc tạo trình tạo danh sách của riêng bạn - dunno.

Tuy nhiên, bạn vẫn làm điều đó, đây vẫn là một "tính năng" thực sự khó chịu của ArcGIS.


0

Điều gì về việc sử dụng một distincttruy vấn con (sau đây là trên một FGur featureclass):

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

Lưu ý từ trợ giúp (10.0) rằng điều này không có giới hạn:

Các trang bìa, shapefiles và các nguồn dữ liệu dựa trên tệp nridodatabase khác không hỗ trợ các truy vấn con.


2
"DISTINCT" chỉ hoạt động với GDB cá nhân chứ không phải tệp GDB.
Jakub Sisak GeoGraphics

0

Như Justin gợi ý. Tôi thường làm một bản tóm tắt về trường mà tôi muốn, sau đó thực hiện một lựa chọn riêng biệt trên dbf chạy một phép tính nhỏ để phân loại từng giá trị riêng biệt sau đó nối nó trở lại ban đầu.
Đó là một chặng đường dài, và bạn phải fenagel với các phương pháp tính toán yêu thích của bạn. nhưng ...
Bất cứ điều gì hoàn thành công việc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.