Python 지리 데이터 처리 3 : 벡터 데이터 읽기 및 쓰기 (1)

1. 벡터 데이터

  도시와 같이 경계가 명확한 지리적 특징은 벡터 데이터로 잘 표현 될 수 있습니다. 그러나 연속 데이터 (예 : 고도 데이터)는 작동하지 않습니다. 산간 지역에서는 고도가 같은 모든 지역의 경계에 다각형을 그리는 것이 매우 어렵습니다. 그러나 서로 다른 고도 범위를 구별하기 위해 서로 다른 다각형을 사용할 수 있습니다. 많은 종류의 데이터가 벡터로 표현하기에 매우 적합합니다. 예를 들어 도로지도의 요소의 경우 도로는 선분으로 표시되고 도시와 군은 다각형으로 표시되며 도시는지도의 축척에 따라 점 또는 다각형으로 표시됩니다. 지도의 모든 요소는 점, 선 및 다각형으로 표현할 수 있습니다.
  벡터 데이터는지도를 만드는 데 매우 적합하지만 몇 가지 단점이 있습니다. 예를 들어, 그림을 그리고 표시 할 때 확대 및 축소하는 방법은 더 나은 표시 효과를 얻을 수 있습니다.

해안선 역설
  영국의 수학자 루이스 프라이 리차드슨은 육지의 해안선을 측정 한 최초의 사람입니다. 그러나 최종 측정 결과는 선택한 척도에 전적으로 의존하기 때문에 측정 프로세스는 그렇게 쉽지 않습니다. 예를 들어, 여러 해협이있는 넓은 해안선 옆에 도로가 있습니다. 이 도로를 따라 운전하면서 자동차의 주행 거리계를 사용하여 거리를 측정 한 다음 차에서 내리고 오는 길로 다시 걸어 간다고 상상해보십시오. 그러나 걸을 때는 해협의 가장자리 곡선을 따르고 도로는 그렇지 않습니다. 우회로가 많기 때문에 여정이 운전보다 멀다는 것을 쉽게 알아낼 수 있습니다. 더 작은 단위로 측정하면 더 많은 변화를 측정 할 수 있기 때문에 전체 해안선을 측정 할 때도 동일한 원칙이 적용됩니다. 영국 해안선을 측정 할 때 50km 증분을 사용하여 측정 한 최종 길이는 100km 증분보다 600km 더 깁니다.

  Shapefile 은 벡터 데이터를 저장하기위한 일반적인 형식입니다. 그러나 그것은 별도의 파일이 아닙니다. 속성 데이터를 저장하려면 마스터 파일 1 개 ( .shp ), 인덱스 파일 1 개 ( .shx ), 스토리지 지오메트리 정보, dBASE ( .dbf ) 테이블 1 개를 포함하여 최소 3 개의 바이너리 파일 이 필요합니다. 3 개의 파일이 같은 폴더에 저장됩니다.
1 Shapefile 파일  다른 형식은 일반 텍스트 파일이며 모든 텍스트 편집기에서 사용할 수있는 GeoJSON 입니다. GeoJSON에는 필요한 모든 정보를 저장하는 하나의 파일 만 포함됩니다.
예 : 온라인 geojson 데이터 형식지도
여기에 사진 설명 삽입
GeoJSON 파일 형식
수동지도 그리기

2. OGR

  OGR 단순 피처 라이브러리는 공간 데이터를 읽고 쓰는 데 매우 인기있는 오픈 소스 라이브러리 인 GDAL (Geospatial Data Abstraction Library)의 일부입니다. GDAL의 OGR 부분에는 다양한 벡터 데이터 형식 을 읽고 쓰는 기능이 있습니다 . 또한 OGR을 사용하면 피쳐의 기하학적 모양 생성조작 하고, 속성 값을 편집하고, 속성 값 또는 공간 위치를 기반으로 벡터 데이터를 필터링 할 수 있으며 데이터 분석 기능도 제공합니다.
  GDAL 라이브러리는 원래 C 및 C ++로 작성되었지만 Python을 비롯한 여러 다른 언어에 바인딩되어 있으므로 이러한 코드가 Python으로 다시 작성되지는 않지만 Python에서 사용되어 GDAL / OGR 라이브러리를 사용하는 인터페이스를 제공합니다. 따라서 Python에서 GDAL을 사용하려면 GDAL 라이브러리와 해당 Python 바인딩을 설치해야합니다.

OGR 클래스 구조
  이 데이터 원본에는 여러 하위 계층 개체가 포함되어 있으며 각 계층은 데이터 원본의 데이터 집합을 나타냅니다.shapefile에는 하나의 데이터 세트 (하나의 레이어) 만 포함됩니다.,하지만 SpatiaLite에는 여러 개가 포함되어 있습니다. 데이터 소스에있는 데이터 세트의 수에 관계없이 각 데이터 세트는 OGR에 의해 계층으로 간주됩니다.
  데이터 소스는 하나 이상의 레이어로 구성됩니다.
  Arcgis의 속성 테이블에서 각 행은 피처를 나타내고 각 열은 속성 필드를 나타냅니다.

속성 테이블

2.1 ogrinfo

  OGR에서 지원하는 벡터 데이터의 정보를 출력하는데 사용됩니다.
  나타나는 오류는 다음과 같습니다.
여기에 사진 설명 삽입
  해결 방법 : osgeo \ gdalplugins 폴더의 ogr_FileGDB.dll을 osgeo 폴더로 이동합니다.
변하기 쉬운
  매개 변수 정보
여기에 사진 설명 삽입
  보기 : 지원되는 형식보기 (부품) :
여기에 사진 설명 삽입
  OGR 버전에 포함 된 드라이버를 알려줄뿐만 아니라 각 드라이버가 읽기 및 쓰기 작업을 지원하는지 여부도 알려줍니다.
  Python을 사용하여 사용 가능한 드라이버를 확인하고 검색을 위해 대화 형 환경 (IDLE)을 사용할 수 있습니다. 먼저 osgeo 패키지에서 OGR 모듈을 가져온 다음 ogr.GetDriverByName을 사용하여 특정 드라이버를 찾습니다.

>>> from osgeo import ogr
>>> driver = ogr.GetDriverByName('GeoJSON')  # GeoJSON不需要区分大小写
>>> print(driver)
<osgeo.ogr.Driver; proxy of <Swig Object of type 'OGRDriverShadow *' at 0x0000013B3CBE8840> 

  오류 데모 :

>>> driver = ogr.GetDriverByName('shapefile') # 正确的名字为:Esri shapefile
>>> print(driver)
None

2.2 업그레이드 pip 명령 (보충)

  1. win + R 다음에 cmd를 직접 선택하지 말고 "시작"- "Windows 시스템"- "명령 프롬프트"-를 선택하십시오."관리자 권한으로 실행"을 마우스 오른쪽 버튼으로 클릭하십시오! ! !
python -m pip install --upgrade pip;
  1. 관리자 권한으로 명령 프롬프트를 실행 한 후미러 다운로드 및 업그레이드!!!
python -m pip install --upgrade pip -i https://pypi.douban.com/simple

업데이트 성공
延迟 问题 : ReadTimeoutError (self._pool, None, 'Read timed out.')를 올립니다.

pip install --index-url https://pypi.douban.com/simple <model>
 
如:pip install --index-url https://pypi.douban.com/simple opencv-python

또는:

pip --default-timeout=100 install -U pip

미러 다운로드 : (빠르고 안정적이며 프로 테스트에서 효과적)

  1. 칭화 미러 : https://pypi.tuna.tsinghua.edu.cn/simple
  2. 알리 : http://mirrors.aliyun.com/pypi/simple
  3. 중국 과학 기술 대학교 : http://pypi.mirrors.ustc.edu.cn/simple
pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com numpy

2.3 ospybook 1.0-Python의 지리 데이터 시각화

  1. 장점 : 다른 소프트웨어 프로그램을 열지 않고도 데이터를 시각화 할 수 있습니다.
  2. 단점 : 낮은 상호 작용

설치 방법 :

  1. 설치 패키지 : ospybook-1.0 폴더 아래 (다운로드 링크 : http://manning.com/garrard/?a_aid=geopy&a_bid=c3bae5be )
  2. 설치하려면 setup.py 디렉토리를 찾고 실행할 명령 줄을 엽니 다.python setup.py 빌드
  3. 다시 뛰어:python setup.py 설치

 ospybook 모듈에서 사용 가능한 드라이버 목록을 출력합니다.

>>> import ospybook as pb  #  使用ospybook模块
>>> pb.print_drivers()     #  输出可用的驱动列表
ESRIC (readonly)
FITS (read/write)
PCIDSK (read/write)
netCDF (read/write)
PDS4 (read/write)
VICAR (read/write)
JP2OpenJPEG (readonly)
JPEG2000 (readonly)
PDF (read/write)
MBTiles (read/write)
BAG (read/write)
EEDA (readonly)
OGCAPI (readonly)
DB2ODBC (read/write)
ESRI Shapefile (read/write)
MapInfo File (read/write)

3. 벡터 데이터 읽기

  전역 데이터 세트가 포함 된 ArcGIS의 Shapefile 형식으로 데이터 세트를 엽니 다.
ne_50m_populated_places.shp
속성 데이터 시트
  Python을 통한 출력 :

import sys
from osgeo import ogr

fn = r'E:\Google\GIS\osgeopy data\global\ne_50m_populated_places.shp'
ds = ogr.Open(fn, 0) # ds = data source,0:表示以只读模式打开文件,1或True:表示以编辑模式打开
if ds is None:  # 确保shapefile文件不为空,可正常打开
    sys.exit('Could not open {0}.'.format(fn))
lyr = ds.GetLayer(0) # 获取图层索引,从0开始,不提供参数时,默认返回第1个图层

i = 0  # 从数据源中取回第1个图层,并遍历此图层中的前5个要素
for feat in lyr:

    
    pt = feat.geometry() # 获得几何对象
    x = pt.GetX()        # 获得坐标位置
    y = pt.GetY()

    # 获得属性值
    name = feat.GetField('NAME')
    pop = feat.GetField('POP_MAX')
    # pop = feat.GetFieldAsString('POP_MAX')  #  数据转换
    # pop = feat.GetFieldAsInteger('POP_MAX')
    print(name, pt, pop, x, y)
    i += 1
    if i == 5:
        break
del ds  # 删除ds变量,强制关闭文件
Bombo POINT (32.5332995248648 0.583299105614628) 75000 32.533299524864844 0.5832991056146284
Fort Portal POINT (30.2750016159794 0.671004121125236) 42670 30.27500161597942 0.671004121125236
Potenza POINT (15.7989964956403 40.6420021300982) 69060 15.798996495640267 40.642002130098206
Campobasso POINT (14.6559965589219 41.562999118644) 50762 14.655996558921856 41.56299911864397
Aosta POINT (7.31500259570618 45.7370010670723) 34062 7.315002595706176 45.7370010670723

3.1 특정 요소에 대한 액세스

  방법 : 피쳐의 특정 오프셋 값, 즉 피쳐 번호 (FID)를 봅니다. 오프셋 값은 0부터 시작하며이 데이터 세트에서 피쳐의 위치를 ​​나타내는 데 사용됩니다.
  레이어의 마지막 기능 가져 오기 :

>>> num_features = lyr.GetFeatureCount()
>>> last_feature = lyr.GetFeature(num_features - 1)
>>> print(last_feature.NAME)
Hong Kong

  현재 요소 : ResetReading () 함수 호출 사용

import os
import sys
from osgeo import ogr
data_dir = r'E:\Google chrome\Download\GIS with python\osgeopy-data\osgeopy-data\osgeopy-data-washington\osgeopy-data'

fn = os.path.join(data_dir, 'Washington', 'large_cities.geojson')
ds = ogr.Open(fn, 0)
lyr = ds.GetLayer(0)
print('First loop')
for feat in lyr:
    print(feat.GetField('Name'), feat.GetField('Population'))

print('Second loop')
lyr.ResetReading() # This is the important line.
for feat in lyr:
    pt = feat.geometry()
    print(feat.GetField('Name'), pt.GetX(), pt.GetY())

3.2 데이터보기

3.2.1 속성보기

  print_attributes 함수를 사용하여 속성 값 정보를 출력하십시오.

print_attributes(lyr_or_fn, [n], [fields], [geom], [reset] )
  1. lyr_or_fn은 레이어 또는 데이터 소스 경로 일 수 있습니다. 데이터 소스 인 경우 첫 번째 레이어가 사용됩니다.
  2. n은 출력 레코드 수를 설정하는 데 사용되는 선택적 값이며 모든 값은 기본적으로 출력됩니다.
  3. fields는 기본적으로 모든 필드를 포함하여 출력 결과에 포함 된 속성 필드 목록을 설정하는 데 사용되는 선택적 값입니다.
  4. geom은 기하학적 피쳐 유형을 출력할지 여부를 설정하는 데 사용되는 선택적 부울 값이며 기본값은 True입니다.
  5. reset 은 값을 출력하기 전에 첫 번째 레코드로 재설정할지 여부를 설정하는 데 사용되는 선택적 부울 값이며 기본값은 true입니다.

  출력 파일에있는 처음 3 개 도시의 이름과 인구 :

>>> import ospybook as pb
>>> fn = r'E:\Google chrome\Download\GIS with python\osgeopy-data\osgeopy-data\osgeopy-data-global\osgeopy-data\global\ne_50m_populated_places.shp'
>>> pb.print_attributes(fn, 3, ['NAME', 'POP_MAX'] )

FID    Geometry                  NAME           POP_MAX    
0      POINT (32.533, 0.583)     Bombo          75000      
1      POINT (30.275, 0.671)     Fort Portal    42670      
2      POINT (15.799, 40.642)    Potenza        69060      
3 of 1249 features

  pb.print_attributes () 함수를 사용하여 소량 데이터의 속성 정보를 볼 수 있지만 빅 데이터의 정보를 볼 수는 없습니다.

3.2.2 공간 데이터 그리기

  ospybook에는 데이터 공간을 시각화 할 수있는 클래스가 포함되어 있으므로 Python의 matplotlib 모듈이 포함됩니다. 데이터를 플로팅하고 표시하려면 VectorPlotter 클래스의 새 인스턴스를 만들어야합니다. 대화 형 모드에서는 드로잉 데이터가 즉시 표시됩니다. 대화 형 모드가 아닌 경우 데이터를 그린 후 그리기 함수를 호출해야합니다.
  플롯 기능 :

plot(self, geom_or_lyr, [symbol], [name], [kwargs])
  1. geom_or_lyr는 피처 개체, 레이어 또는 데이터 소스에 대한 경로입니다. 데이터 소스 인 경우 데이터 소스의 첫 번째 레이어가 그려지고 표시됩니다.
  2. 기호는 기하학적 요소의 기호 스타일을 설정하는 데 사용되는 선택적 값입니다.
    1. fill = False : 속이 빈 다각형
    2. "Bo": 파란색 원
    3. "Rs": 정사각형
    4. "B-": 파란색 선
    5. "R–": 점선 (각 단위는 수평)
    6. "G": 점선 (각 단위는 수직)
  3. name은 나중에 액세스 할 수 있도록 데이터의 이름을 설정하는 데 사용되는 선택적 값입니다.
  4. kwargs는 키워드로 지정되는 선택적 값입니다. kwargs는 종종 불확실한 수의 키워드 인수에 대한 약어로 사용됩니다.

matplotlib

matplotlib로 그린지도 :

>>> import os
>>> os.chdir(r'E:\Google chrome\Download\global') #  更改工作目录,可直接使用该文件夹下的文件名,而不需要从新键入整个目录
>>> from ospybook.vectorplotter import VectorPlotter
>>> vp = VectorPlotter(True)  #  创建一个交互式绘图面板
>>> from matplotlib.pyplot import *     # 此处需要导入matplotlib模块进行绘图
>>> vp.plot('ne_50m_admin_0_countries.shp', fill=False)  # fill参数使文件用空心多边形表示
>>> vp.plot('ne_50m_populated_places.shp', 'bo')  # bo表示蓝色圆圈
>>> vp.draw()

결과 보여줘:
여기에 사진 설명 삽입

추천

출처blog.csdn.net/amyniez/article/details/113061835