사람들은 어떻게 ArcPy에서 파이썬 데이터 구조와 클래스를 사용합니까?


16

이 질문은 프로그래밍에 대한 무지를 드러 낼 수 있지만 사람들이 ArcPy 내에서 다른 파이썬 데이터 구조를 어떻게 사용하고 있는지 궁금합니다.

이 페이지 에는 Python의 데이터 구조가 나열되어 있습니다. GIS에서 목록을 구현하는 방법 (기능 클래스 목록, 기능 유형 목록, 데이터 프레임 목록 등)을 이해합니다. 세트를 사용하여 중복을 제거하는 방법을 이해합니다. 사람들이 ArcPy 내에서 튜플, 사전 및 기타 데이터 구조를 어떻게 구현하고 있습니까? 또한 내가 나열하지 않은 목록과 세트의 다른 예가 있습니까?

또한 사람들은 ArcPy에서 사용자 정의 클래스를 만들고 있습니다. 어떤 상황과 상황에서 이것들이 필요합니까? 예를 들어 줄 수 있습니까? 내장 아크 피 클래스로부터 상속받은 커스텀 클래스를 만드는 사람이 있습니까?

이 모든 질문에 대한 답변이 필요하지 않습니다. 사람들이 GIS에서 Python을 사용하는 방법과 이러한 사용자 지정이 필요한 워크 플로는 궁금합니다.


4
흥미로운 질문이지만 확실한 대답은 없습니다. 커뮤니티 위키 여야합니다.
RK

답변:


14

여러 입력을받는 많은 arcpy 함수는 Python 목록 객체를 허용합니다.

예를 들어, Dissolve_management함수는 필드 이름 목록을 허용하여 다음을 해석합니다.

arcpy.Dissolve_management("taxlots", "C:/output/output.gdb/taxlots_dissolved",
    ["LANDUSE", "TAXCODE"], "", "SINGLE_PART", "DISSOLVE_LINES")

튜플은 당신이 요소의 순서 또는 번호를 수정할 필요가 없습니다 때 튜플은 목록 대신 사용할 수 있습니다 불변 . 이들은 타임 스탬프의 요소 또는 포인트의 좌표와 같이 이기종이지만 관련된 데이터 조각에 유용한 데이터 구조입니다. 튜플은 고정 된 수의 속성을 가진 별개의 레코드로 사용되는 튜플 목록을 종종 볼 수 있지만, 목록은 크기를 쉽게 변경하고, 순서를 다시 정렬 (정렬) 할 수 있습니다 . 사용에 대한 자세한 내용은이 StackOverflow 질문 을 참조하십시오. 목록 대 튜플.

사전은 빠른 조회 테이블로 사용되어 비교적 작지만 자주 사용되는 키-값 쌍 세트를 메모리에 캐시 할 수 있습니다. ArcGIS 포럼에서 흥미로운 예를 보았습니다. http://forums.arcgis.com/threads/55099-Update-cursor-with-joined-tables-work-around-w-dictionaries

조인 대신 사전을 사용하면 계산 시간이 3.5 시간에서 15 분으로 빨라졌습니다.

더 간단한 예는 약식 상태 이름 (CA)이있는 속성을 가진 백만 개의 주소 레코드가 있지만 표시를 위해 적절한 이름 (캘리포니아)을 철자하려는 경우이 사전 을 조회 테이블로 사용할 수 있습니다. 전체 상태 이름 필드를 채 웁니다.

필자는 arcpy에서 사용하기 위해 Python으로 클래스를 작성할 필요가 없지만 그러한 유스 케이스가 없다고 말할 수는 없습니다. 클래스는 일부 입력 (데이터)에서 작동하는 밀접하게 관련된 함수 (동작) 집합이 있고 이러한 데이터와 동작을 객체 지향 방식으로 사용할 수있을 때 유용 할 수 있습니다. 비즈니스 로직에 따라 다르며 arcpy와 관련이 없습니다.


7

Blah238 은이 주제를 잘 다루므로 내 작품에서 몇 가지 예를 추가합니다. 나는 많은 공항 데이터를 개발하고 정기적으로해야 할 일 중 하나는 활주로에서 조사 된 활주로 중심선을 따라 읽습니다. 이 점들이 (GIS 데이터베이스에서) 순서대로되어 있다고 생각할 것입니다. 중심선 점은 중심선을 따라 10 피트마다 발생하며 10 피트 간격으로 배치 된 두 개의 다른 측량 점 옆에 측면이 있습니다. 당신은 그림을 얻을 수 있습니다 : 많은 점 ... 그리고 일반적으로 모두 데이터베이스 방식으로 혼합되어 있습니다. 스크립트에서 수행하는 작업을 통해 속성별로 (또는 필요한 경우 공간적으로) 중심선 점을 선택하고 각 좌표를 읽고 결과를 Python 목록에 덤프하는 것이 가장 쉬운 방법입니다. 그런 다음 정렬, 팝, 반전 등을 할 수 있습니다.

마찬가지로, 나는 파이썬 사전을 광범위하게 사용합니다 (아마도 일부는 승인하는 것보다 훨씬 큽니다). 공항의 각 활주로 끝마다 3D 단위 벡터 세트를 만들어야하며 스크립트 내에서 지속적으로 액세스하여 여러 스크립트에서이 작업을 수행합니다. 정기적으로 액세스하는 다른 많은 데이터 세트도 사전에 보관합니다. 목록과 마찬가지로 빠르고 유연합니다. 추천.

Blah238과 같이 수업이 진행되는 한 나는 아무것도 만들 필요가 없었습니다. 내 스크립트에서 클래스가 선호되는 경우가 있지만 실제로 그 장소를 식별 할 수 없었습니다. 더 많은 프로그래밍 경험을 가진 사람은 아마 빨리 찾을 것입니다.


5

나도 사전을 좋아 합니다-항상 사용하십시오. 이 메소드는 일부 공간 참조 특성을 가져 와서이를 모두 dict에 저장합니다.

def get_coord_sys(self, in_dataset):
    """Get and return info on dataset coord sys/projection"""
    spatial_ref = arcpy.Describe(in_dataset).spatialReference
    # Get spatial ref props and put in dictionary
    spat_ref_dict = {}
    spat_ref_dict["name"] = spatial_ref.name
    spat_ref_dict["type"] = spatial_ref.type
    spat_ref_dict["gcs_code"] = spatial_ref.GCSCode
    spat_ref_dict["gcs_name"] = spatial_ref.GCSName
    spat_ref_dict["pcs_code"] = spatial_ref.PCSCode
    spat_ref_dict["pcs_name"] = spatial_ref.PCSName
    return spat_ref_dict

이 메소드 스 니펫은 두 피쳐 클래스에서 포인트 형상을 추출한 다음 나중에 형상을 사용하여 일부 삼각법을 수행합니다.

def build_fields_of_view(self):
        """For all KOPs in a study area, build left, right, center FoV triangles"""
        try:    
            fcs = {os.path.join(self.gdb, "WindFarmArray"):[], os.path.join(self.gdb, "KOPs"):[]}
            # Build a dict of WTG and KOP array geometries, looks like:
            #  {'KOPs': [[1, -10049.2697098718, 10856.699451165374], 
            #            [2, 6690.4377855260946, 15602.12386816188]], 
            #   'WindFarmArray': [[1, 5834.9321158060666, 7909.3822339441513], 
            #                     [2, 6111.1759513214511, 7316.9684107396561]]}
            for k, v in fcs.iteritems():
                rows = arcpy.SearchCursor(k, "", self.sr)
                for row in rows:
                    geom = row.shape
                    point = geom.getPart()
                    id = row.getValue("OBJECTID")
                    v.append([id, point.X, point.Y])   

            kops = fcs[os.path.join(self.gdb, "KOPs")] # KOP array
            wtgs = fcs[os.path.join(self.gdb, "WindFarmArray")] # WTG array

현재 작업중인 많은 부분은 벡터 피쳐 클래스 및 래스터에서 좌표 및 속성을 추출하여 GIS 데이터가 무엇인지 모르는 다른 소프트웨어로 데이터를 푸시 할 수 있습니다. 그래서 나는 이것을 위해 목록과 사전을 많이 사용합니다.


답변 해주셔서 감사합니다. 이러한 경우 사전이 다른 데이터 구조보다 더 나은 선택 인 이유는 무엇입니까?
Fezter

키로 값을 호출 할 수 있기를 원합니다.
채드 쿠퍼

2
지시가 바람직한 또 다른 이유는 순서가 없기 때문에 목록보다 훨씬 빠르게 읽히기 때문입니다. 따라서 목록이 너무 길면 항목이 많은 경우 처리하는 데 시간이 조금 더 걸릴 수 있습니다.
ndimhypervol

@gotanuki True, 큰 목록을 사용해야하는 경우에는 목록보다 빠르기 때문에 튜플을 대신 사용하십시오.
차드 쿠퍼

2

읽기 함께 답변을 넣고 몇 가지 수정을해야했던 ..

저는 파이썬 전문가는 아니지만 클래스를 사용하는 배후의 아이디어는 데이터 구조와 관련이 있고 메소드를 중앙 집중화 할 준비가 된 많은 메소드가있는 객체를 인스턴스화 할 수 있다고 생각합니다. 클래스 대 모듈에는 몇 가지 가변 범위 이점이 있으며 위의 링크는이 시점에 도달합니다.

featureLayer라는 클래스가 있습니다 (아마도 pythonic-ly named ... 아직 학습하지 않음). 내가 할 수있는

sys.path.append(r"\\Path\To\Scripts")
import gpFuncs as gpF
fc = arcpy.GetParameterAsText(0)
featureLayer = gpF.featureLayer(fc)
points = featureLayer.featureVerticesToPoints(featureid, "", first_and_last)

이를위한 정의는 피처, 파트 및 정점을 반복하는 클래스 메소드입니다. 그런 다음 내 포인트 객체를 featureLayer 인스턴스로 바꾸고 클래스에있는 다른 작업을 수행 할 수 있습니다.

올바르게 클래스를 빌드하면 기능을 침해해야한다고 생각합니다. 예를 들어 곧 모든 기능 레이어에있는 메소드 및 속성이있는 featureLayer 클래스를 갖도록 리팩토링을 시작하겠습니다. 그런 다음 모든 featureLayers 속성 / 방법을 상속하지만 다각형과 같은 특정 지오메트리 유형으로 인스턴스화하는 featureLayerStrict 클래스 인스턴스를 빌드하기 위해 상속합니다.


4
명명 규칙 은 Python 스타일 가이드 (일명 PEP 8) 를 확인하십시오 .
blah238

0

나는 주로 VB .net에서 일하지만 파이썬과 arcpy를 점점 더 많이 사용합니다. VB에서는 코드를 더 명확하게 읽을 수 있도록 Enum을 사용하려고합니다. 이전 버전의 python은 Enum을 구현하지 않았으므로 일부 속성을 노출시키는 클래스를 만드는 것이 었습니다 . 스택 오버플로 에 대한 예제가 많이 있습니다. 이제 파이썬 구현 논의되는 이들의 최신 버전처럼 보인다 여기 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.