Python地理データ処理3:ベクターデータの読み取りと書き込み(1)

1.ベクターデータ

  都市などの明確な境界を持つ地理的特徴は、ベクトルデータで適切に表すことができます。ただし、連続データ(標高データなど)は機能しません。山岳地帯にいる場合、同じ標高のすべての領域の境界にポリゴンを描画することは非常に困難です。ただし、さまざまなポリゴンを使用して、さまざまな高度範囲を区別できます。多くの種類のデータは、ベクトルで表すのに非常に適しています。たとえば、道路地図上の要素の場合、道路は線分で表され、都市と郡はポリゴンで表され、都市は地図の縮尺に応じてポイントまたはポリゴンで表されます。マップ上のすべての要素は、点、線、および多角形で表すことができます。
  ベクターデータは地図の作成に非常に適していますが、いくつかの欠点があります。たとえば、描画および表示する場合、ズームインおよびズームアウトする方法により、より優れた表示効果を実現できます。

海岸線のパラドックス
  イギリスの数学者ルイス・フライ・リチャードソンは、土地の海岸線を測定した最初の人物でした。しかし、最終的な測定結果は選択したスケールに完全に依存するため、測定プロセスはそれほど簡単ではありません。たとえば、複数の海峡がある広い海岸線には、その横に道路があります。この道路に沿って運転し、車の走行距離計を使用して距離を測定し、車から降りて、来た道を歩いて戻ることを想像してみてください。ただし、歩くときは海峡の端のカーブをたどりますが、道路はそうではありません。迂回路がたくさんあるので、旅は運転よりも遠いことは簡単にわかります。同じ原則が海岸線全体の測定にも当てはまります。これは、小さな増分で測定すると、より多くの変化を測定できるためです。イギリスの海岸線を測定する場合、50キロメートルの増分を使用して測定された最終的な長さは、100キロメートルの増分よりも600キロメートル長くなります。

  シェープファイルは、ベクターデータを保存するための一般的な形式です。しかし、それは別のファイルではありません。属性データを格納するために、マスターファイル(.shp)、インデックスファイル(.shx)、ストレージジオメトリ情報、dBASE(.dbf)テーブルを含む少なくとも3つのバイナリファイルが必要です。3つのファイルが同じフォルダに保存されます。
1シェープファイルファイル  もう1つの形式はGeoJSONです。これはプレーンテキストファイルであり、任意のテキストエディタで使用できます。GeoJSONには、必要なすべての情報を格納する1つのファイルのみが含まれています。
例:オンラインgeojsonデータ形式マップ手動でマップ
ここに画像の説明を挿入します
GeoJSONファイル形式
を描画

2. OGR

  OGRシンプル機能ライブラリは、空間データの読み取りと書き込みに非常に人気のあるオープンソースライブラリであるGeospatial Data Abstraction Library(GDAL)の一部です。GDALのOGR部分には、さまざまなベクターデータ形式の読み取りと書き込みの機能がありますOGRを使用する、フィーチャの幾何学的形状作成および操作したり、属性値を編集したり、属性値または空間位置に基づいてベクターデータをフィルター処理したりできます。また、データ分析機能も提供します。
  GDALライブラリは元々CおよびC ++で記述されていましたが、Pythonを含む他のいくつかの言語にバインドされているため、これらのコードはPythonで書き直されていませんが、PythonではGDAL / OGRライブラリを使用するために使用されます。インターフェイスを提供します。したがって、PythonでGDALを使用する場合は、GDALライブラリと対応するPythonバインディングをインストールする必要があります。

OGRクラス構造
  このデータソースには複数のサブレイヤーオブジェクトが含まれており、各レイヤーはデータソース内のデータセットを表します。シェープファイルには、1つのデータセット(1つのレイヤー)のみが含まれます、しかし、SpatiaLiteには複数が含まれています。データソースにデータセットがいくつあっても、各データセットはOGRによってレイヤーと見なされます。
  データソースは、1つ以上のレイヤーで構成されます。
  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

更新に成功しました
延迟问题:raise ReadTimeoutError(self._pool、None、 '読み取りがタイムアウトしました。')

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. Ali: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 ospybook1.0-地理データのPython視覚化

  1. 利点:他のソフトウェアプログラムを開かずにデータを視覚化するのに役立ちます
  2. 短所:双方向性が低い

インストール方法:

  1. インストールパッケージ:ospybook-1.0フォルダーの下(ダウンロードリンク:http://manning.com/garrard/?a_aid = geopy&a_bid = c3bae5be
  2. インストールするには、setup.pyディレクトリを見つけ、コマンドラインを開いて実行します。pythonsetup.pyビルド
  3. 再実行:python setup.py install

 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でシェープファイル形式で開きます。
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. symbolはオプションの値であり、幾何学的要素のシンボルスタイルを設定するために使用されます
    1. fill = False:中空ポリゴン
    2. 「ボー」:青い円
    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