중복을 만들지 않고 Excel에서 QGIS의 속성 테이블로 데이터를 조인 하시겠습니까?


15

QGIS에 두 개의 빈 필드가있는 속성 테이블이 있습니다.

예 _1

QGIS에서 빈 필드를 채우기 위해 Excel 데이터베이스를 가져오고 싶습니다. 내 Excel 파일은 QGIS 속성 테이블의 열과 일치합니다.

예 _2

Excel (.CSV)을 shapefile에 올바르게 결합 할 수 있습니다. 그러나 원하는대로 빈 필드를 채우는 대신 프로세스가 중복을 생성했습니다. «테이블 관리자»의 도움으로 상황을 수정할 수 있지만 시간이 많이 걸립니다. Excel 데이터에보다 효율적으로 참여할 수있는 방법을 찾고 있습니다.

예 _3

중복을 만들지 않고 Excel 파일을 속성 테이블에 결합하려면 어떻게해야합니까?


3
이 자습서를 살펴보십시오 : 테이블 조인 수행
ArMoraer

답변:


13

나는 삶을 더 쉽게 만들기 위해 다음과 같은 일을 할 것입니다.

이 작업을 수행하기 전에 shapefile을 백업하십시오.

  1. 셰이프 파일에서 레이어 속성 / 필드로 이동하여 편집 모드를 켭니다.
  2. ID 필드를 제외한 모든 필드를 선택하십시오
  3. ID 필드를 제외한 모든 필드 삭제
  4. QGIS에서 csv 파일을 레이어로 추가 (주 메뉴 / 레이어 / 레이어 추가 / 구분 된 텍스트 레이어 추가) 여기에 이미지 설명을 입력하십시오(지오메트리 선택 안 함)
  5. 쉐이프 파일에서 속성 / 조인을 선택하고 소스 및 대상의 ID 필드를 모두 선택하십시오. 이 질문에 대한 다른 답변에서 설명한 것처럼.
  6. 수정 된 Shapefile을 저장하십시오.

여기에 이미지 설명을 입력하십시오

이것이 내가 참조하는 필드 탭입니다

여기에 이미지 설명을 입력하십시오

불필요한 필드를 삭제하기 전과 후에 편집을 토글하는 것을 잊지 마십시오


13

Excel 파일을 shapefile에 결합 할 수 있습니다. 공통 속성으로 결합하고 결과는 각 레코드가 shapefile 및 Excel 파일의 속성을 보유하는 결합 된 계층이됩니다.

먼저 Excel 파일과 벡터를 나중에 레이어에로드하십시오. 내가 만든 일부 테스트 데이터를 사용했지만 설정이 아래와 비슷해야합니다. 여기에 이미지 설명을 입력하십시오

이제 레이어 패널에서 레이어를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택한 다음 결합을 선택하십시오. 먼저 왼쪽 하단의 녹색 + 기호 (아래 그림의 큰 빨간색 화살표)를 누르면 새로운 벡터 조인 추가 메뉴가 나타납니다 (아래와 같이) 여기에 조인 레이어가 엑셀 파일이됩니다 (따라서 적절한 엑셀 파일을 선택하십시오) & sheet) 결합 필드는 shapefile에 대한 공통 속성을 보유하는 Excel 파일의 필드입니다. 대상 필드는 shapefile에서 일치하는 필드입니다. (제 경우에는 두 공통 필드가 모두 단위로 명명되었지만 셰이프 파일에서 필드가 UNIT_라고 불리는 경우 내 대상 필드에 UNIT 대신 해당 필드를 사용했을 것입니다)
여기에 이미지 설명을 입력하십시오 조인시 엉망이 될 수있는 몇 가지 다른 옵션이 있습니다. 어쨌든 특정 필드 만 보려는 경우와 같이 이제는 조인됩니다. 돌아가서 모양 파일의 속성을 보면 볼 수 있습니다. 이제 아래와 같이 Excel 파일의 해당 속성이 있습니다.

여기에 이미지 설명을 입력하십시오

다음은 단계별로 수행하는 방법을 보여주는 몇 가지 유용한 자습서입니다.

https://www.mapbox.com/tilemill/docs/guides/joining-data/

http://maps.cga.harvard.edu/qgis/wkshop/join_csv.php

http://qgis.spatialthoughts.com/2012/03/using-tabular-data-in-qgis.html

QGIS에서 shapefile의 속성 테이블로 외부 테이블을 조인하는 방법은 무엇입니까?

http://www.digital-geography.com/qgis-tutorial-ii-how-to-join-data-with-shapefiles/#.Vs9vpmHXKUk

의견에 언급 된 튜토리얼 ArMoraer.


나는 mapbox.com/tilemill/docs/guides/joining-data 튜토리얼을 보았습니다 . 그러나 여전히 DBF 파일을 shapefile에 조인 할 수 없습니다. 내 테이블 구조가 완벽하게 일치하기 때문에 나를 놀라게합니다. «Join field»와«Target field»를 이해하지 못하는 것 같습니다. 더 자세한 내용을 추가해 주시겠습니까?
Laurent Robitaille-Lainesse

1
@Laurent Robitaille-Lainesse 더 많은 단계별 가이드로 게시물을 업데이트했습니다. 내 단계가 올바른지 확인하기 위해 테스트 Excel 파일을 다각형 shapefile에 결합했습니다.
ed.hank

Excel 파일을 QGIS에 올바르게 결합하는 데 성공했습니다. «join»옵션이 속성 테이블에 새 필드를 추가하는 것을 관찰했습니다. 내가 틀렸다면 수정하십시오. 그러나 Excel 파일의 데이터를 속성 테이블의 빈 필드에 추가하는 것은 불가능합니다.
Laurent Robitaille-Lainesse

1
빈 필드가있는 경우 필드 계산기를 사용하여 새로 조인 된 필드에서 테이블의 필드로 채 웁니다.
ed.hank

10

다른 방법을 추가하기 위해 로드 할 때 프로젝트 매크로 를 설정할 수 있습니다 .

  1. shapefile을 csv에 자동으로 결합
  2. IP1IP2필드를 업데이트 합니다
  3. shapefile의 필드 만 남기고 결합 된 필드를 제거합니다 (즉, 중복되지 않음).

먼저 프로젝트를 작성하지 않은 경우 작성하고 도구 모음으로 이동하십시오.

프로젝트> 프로젝트 속성 ...> 매크로

그런 다음 def openProject():함수 에서 다음 코드를 사용 하여 레이어 이름과 결합하려는 필드를 입력하십시오. 필드와 함께 shapefile 및 csv 파일에 대해 "Example"및 "spreadsheet"를 각각 사용했습니다 ID.

from PyQt4.QtCore import *
import qgis
from qgis.core import QgsMapLayerRegistry, QgsVectorJoinInfo

for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    # Change to your shapefile name
    if layer.name() == "Example":
        qgis.utils.iface.setActiveLayer(layer)
        shp = qgis.utils.iface.activeLayer()

for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    # Change to your csv name
    if layer.name() == "spreadsheet":
        qgis.utils.iface.setActiveLayer(layer)
        csv = qgis.utils.iface.activeLayer()

# Set up join parameters
shpField='ID'
csvField='ID'
joinObject = QgsVectorJoinInfo()
joinObject.joinLayerId = csv.id()
joinObject.joinFieldName = csvField
joinObject.targetFieldName = shpField
shp.addJoin(joinObject)

# Define fields to update and joined fields to copy values from
ip1 = shp.fieldNameIndex('IP1') 
ip1_join = shp.fieldNameIndex('spreadsheet_IP1')
ip2 = shp.fieldNameIndex('IP2') 
ip2_join = shp.fieldNameIndex('spreadsheet_IP2')

shp.startEditing()
for feat in shp.getFeatures():
    shp.changeAttributeValue(feat.id(), ip1, feat.attributes()[ip1_join])
    shp.changeAttributeValue(feat.id(), ip2, feat.attributes()[ip2_join])
shp.commitChanges()

# Remove join 
shp.removeJoin(csv.id())

프로젝트 매크로

확인 층이되어 있는지 확인 하지 합류, 프로젝트를 저장 하고 매크로를 사용 도구 모음으로 이동하여 :

설정> 일반> 매크로 사용


이제 프로젝트를 닫고 csv 파일을 편집하면 다음에 프로젝트를로드 할 때 필드가 자동으로 업데이트됩니다.

CSV 파일 편집

결과


7

내 제안은 오픈 소스 LibreOffice / Open Office 를 사용하여 Excel 파일을 편집하고 .dbf 파일을 만드는 것입니다. 테스트 워크 북을 준비했습니다. 테스트 통합 문서-링크

  1. Libre Office / Open Office에서 파일을 엽니 다.
  2. Excel 파일에서 "Excel"시트 데이터에 붙여 넣습니다.
  3. .dbf 파일에서 "DBF"시트 데이터에 붙여 넣기 (ID, X, Y 만 붙여 넣기) (IP1, IP2 값이 자동으로 추가됨)
  4. name.dbf 파일로 저장하십시오 (여기서 이름은 모양 파일 이름과 동일 함).

QGIS에서 중복되지 않은 결과 테이블 : 여기에 이미지 설명을 입력하십시오


5

빈 필드가 시작되는 이유는 무엇입니까? 빈 필드없이 시작하여 조인에서 생성 된 두 개의 열만 사용할 수 있습니까? 이것이 가장 간단한 방법이라고 생각합니다. 또는 ArcGIS의 "로드"도구와 유사한 도구를 찾으십시오.

https://desktop.arcgis.com/en/arcmap/latest/extensions/production-mapping/loading-data-into-a-geodatabase.htm

지오 데이터베이스를 사용하지 않는 경우이 방법을 적극 권장합니다.


지오 데이터베이스를 사용하고 있지 않습니다. 사실, 나는 그것을 familliar하지 않습니다.
Laurent Robitaille-Lainesse

1
@ LaurentRobitaille-Lainesse 새로운 파일 지오 데이터베이스를 생성 한 다음 그 안에 새로운 피쳐 클래스를 생성하고이를 사용하여 데이터를 저장하는 것이 좋습니다. 또한 지오 데이터베이스 및 피처 클래스에 대한 간단한 연구와이를 사용하는 이유, 셰이프 파일 이외의 기능을 제공하는 것이 좋습니다.
Stella

4

.shp 파일이 .DBF (데이터베이스 파일)에 기인하여 지원되므로 복제하지 않고 직접 참여할 수있는 방법이 있는지 모르겠습니다. 이 DBF에는 정수, 실수, 문자열 등과 같은 열 유형의 길이와 정밀도가 자세히 선언되어 있습니다. CSV 파일에는 선언 된 유형이없는 일반 열만 있습니다. 파일이 얼마나 큰지 모르겠습니다. 나를 위해, 나는 중복 필드를 유지하고 일반 수식과 함께 필드 caluclator 를 사용 합니다 .

Original Field_x = 중복 Field_x

그런 다음 모든 중복 필드를 삭제하십시오 (QGIS 또는 데이터베이스 프로그램을 통해).


3

이 문제를 해결하는 가장 쉬운 방법은 조인 전에 QGIS 테이블에서 문제의 두 열을 삭제하는 것입니다. 그런 다음 shapefile을 결합하면 원하는 두 열이 중복되지 않고 원래 열 이름을 유지합니다.

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