개요

해당 문서의 대상 독자(이하 서술 조건의 대부분에 속하신다면 대상이십니다)

  • 급하게 ArcGIS로 데이터를 처리해야 함
  • javascript보다는 python이 편함
  • ArcGIS에 데이터는 올렸는데 편집이 필요하다. 근데 나 맥 써서...ArcGIS Pro로 대응을 할 수 없다. <- 글쓴이는 이 경우였음
  • ArcGIS Online이 편하다.

해당 문서의 주요 키워드

  • ArcGIS
  • ArcGIS Online
  • ArcGIS Python API

내용

1. ArcGIS API package를 통한 local 사용

전제 : ArcGIS Pro 또는 ArcGIS Server가 깔려 있는 컴퓨터

  • 2021년까지만 해도 ESRI는 ArcGIS 제품이 해당 머신에 깔려 있는 경우에만 API를 사용하도록 허용했다.
  • 2021년 부터는 새로운 방법을 지원한다고 하는데, 솔직히 뭐가 바뀌었는지는 모르겠다.(문서 작성 당시인 2022년 10월에 시도했지만 실패)
  • 해당 방법은 기존 API 사용시 가장 기본으로 생각하는 경우이다.
  • 두 제품군 모두 윈도우에서만 지원한다.
  • arcgis (python) package가 미리 깔려있음을 전제함
  • 다음의 두가지 방법이 있다(참고 : 문서)
    • python pakcage manager를 사용하라고 안내한다.
    • arcgis가 설치된 폴더 내에 위치한 Python Command Prompt를 켜서 conda명령어를 통해 python api를 깐다.

전제 : ArcGIS 제품군이 없는/설치 불가인 머신

(문서 작성 시 참 많은 시도를 해봤는데, 잘 되지 않았다.)

  • conda를 사용해서 리눅스에도 깔 수 있다고 문서에 나와있지만 실패.
  • install offline
    • 파일 다운로드 받아서 압축 풀기 > conda에서 offline 설치 가능하게 환경 설정 > 명령어
    • 공식 문서에는 The conda
      utility will pull all the arcgis package dependencies from the installed set of Anaconda libraries instead of searching the internet. 라고 되어있지만 cli로 테스트해보니까 제대로 import 되지 않아 포기
  • docker install
    • 사실상 윈도우만 지원 (참고 : 문서)

2. ArcGIS Online을 통한 API 사용

전제 : ArcGIS Online 내 notebook 서버 사용

  • arcgis package만 지원하는 서버 : 무료

    • 우리가 하는 일을 하려면 arcgis 서버에 접근해야 하는데, 접근 권한을 얻기 위해서는 arcgis package에서 지원하는 GIS class 를 통해 접근 권한을 얻어야 한다.

    • 예시

      from arcgis.gis import GIS
      gis = GIS() # anonymous connection to www.arcgis.com
      # Search for 'USA major cities' feature layer collection
      search_results = gis.content.search('title: USA Major Cities',
                                        'Feature Layer')
  • 다른 옵션

    • arcpy 지원하는 서버 : 크레딧
    • arcpy + gpu resouces : 크레딧

ArcGIS Online을 통한 Python API 사용 예시

1. feature layer access

주의 : 아래 나오는 코드들은 모두 예시 코드로, 실제 접속 정보는 제외함. 데이터도 이하동문.

password = 'blablabla'
# jungham.map.arcgis.com은 해당 계정이 속한 organization의 주소
# source로 해당 계정이 접속할 수 있는 데이터에 접근 가능(contents)
source = GIS("https://jungham.maps.arcgis.com", f"{arcgis_user_account}", f"{password}", verify_cert=False)
# 이 레이어의 이름은 ham, 자원 유형은 'Feature Layer'이다 
sample_data_layer = source.content.search('ham',item_type='Feature Layer')

2. feature layer update

1) geometry 형태

{"x": -10617585.164750207,"y": 5160968.961654072,"spatialReference": {"wkid": 102100, "latestWkid": 3856}
}

2) feature 형태

아래는 layer를 이루는 feature 하나의 정보이다.

    {"geometry": 
    {"x": 13948339.367548944, "y": 4677527.208890018, "spatialReference": {"wkid": 4326}}, 
    "attributes": {"FID": 6, "type": 'candyshop', "content": "old-fashioned candyshop", "create_datetime": "2019-03-11 00:00:00"}
    }

3) 업데이트 예시

ArcGIS 내에서 데이터 구조를 이해하면 아래의 코드가 쉽게 이해된다.
OGC 표준에서는 보통 featurecollection > features > feature 이런 단계로 정의가 되는데
ArcGIS에서는 featurelayer > layer > featureset > feature 이런 구조로 데이터를 관리하고 있다.
그리고 Pandas의 DataFrame을 확장한 spatially enabled DataFrame(sedf)이라는 독특한 데이터 타입을 정의해서 featureset에 이 타입을 대응해서 사용하고 있다.

# spatially enabled Dataframe -> featureset -> update
# features in layer are treated as 'featureset'
sedf = pd.DataFrame.spatial.from_geodataframe(sample_event_df)
# adds, updates, deletes 등의 키워드가 있다. 
sample_data_layer[1].layers[0].edit_features(adds=sedf.spatial.to_featureset())

ArcGIS 내에서 데이터를 관리하는 구조와 그 타입

해당 내용은 Python API 사용 방법을 이해하는데 도움이 되었기에 사용 예제와 함께 적는다.

데이터 구조

  • FeatureLayer > layer > featureset > feature
  • 실제 서버에서 publish된 layer(feature layer를 예시로 들면) 아래에는 여러 layer가 포함되어 있을 수 있다. 그리고 하나의 layer는 featureset 내에 feature 데이터를 저장한다. featureset은 feature의 집합이다. feature들을 list로 가지고 있다.

시간 활성화

시간 활성화 메뉴얼에 대한 추가 설명

시간 활성화 메뉴는 메뉴얼을 봐도 찾기 힘들었다.
published feature layer 아래에 layer의 집합이 있다. 그러니까 feature layer는 layer의 집합이다.
예를 들면, 'the location of the opened shops' 라는 이름의 feaure layer가 있으면 그 아래에 'the location of the opened shops_0'이라는 point layer가 존재한다. 실제로 사용한 feature layer의 경우 {feature layer name}_0라는 이름을 가진 기하 레이어가 그 아래에 존재한다.

피처 레이어는 건물, 필지, 도시, 도로, 지진 진앙 등 유사한 지리적 피처를 그룹화한 것입니다. 피처는 포인트, 라인 또는 폴리곤(영역)일 수 있습니다.

문구 출처 : 피처 레이어

아래 첫번째 그림은 feature layer아래에 위치한 layer에 들어가서 시간 옵션을 활성화하는 예시이다.


아래 두번째 그림은 시간 옵션을 활성화 했을 때 arcgis online map viewer에서 해당 layer를 열었을 경우 자동으로 time series bar가 생긴 화면이다.

date field가 활성화 되어 있어야 하며, 이 때 해당 column에 유효하지 않은 값이 저장되어 있다면 해당 시간 옵션은 활성화되지 않는다.

그림 출처 : How To: Enable time on a layer in ArcGIS Online and create a web app with time animation

후기와 회고

  • ArcGIS Python API를 사용하는데, 문서간의 연속성이 없어서 문서 간 이동을 통해 얻어낸 내용을 정리하고 싶었다.
  • 좀 더 직설적으로 '구려!'라고 말하고 싶지만, 누구에게는 ArcGIS가 많은 일들을 해주고 있을 것이고, 실제로도 그렇기 때문에 그렇게는 적고 싶지 않았다. 문제는 존재하니까 남은건 푸는 것일 뿐. 다만 아래 한 마디만 남기겠다.
  • 한국 서비스 지원 센터에 문의를 했으나...
  • ArcGIS 한국인 사용자 중 python api를 어떻게 써야 할지 감이 잡히지 않는다면, 데이터를 불러오는 간단한 예제부터 따라해보라고 말하고 싶다. 이 글이 그런 분들에게 도움이 되길 바라는 마음에서 작성했다.
  • 정리하다 보니, feature layer crud 예제까지 작성해도 될 것 같았다. 그것은...! 시간이 되면 이 글에다가 추가하겠다.

+ Recent posts