LayerMappingデータインポートユーティリティ—Djangoドキュメント

提供:Dev Guides
< DjangoDjango/docs/3.2.x/ref/contrib/gis/layermapping
移動先:案内検索

LayerMappingデータインポートユーティリティ

LayerMapping クラスは、ベクトル空間データファイルのコンテンツをマップする方法を提供します(例: シェープファイル)をGeoDjangoモデルに変換します。

このユーティリティは、ベクターレイヤーからジオメトリとフィールドを引き出し、別の座標系に変換するコードの繰り返しを排除するという作者の個人的なニーズから生まれました(例: WGS84)、GeoDjangoモデルに挿入します。

ノート

LayerMapping を使用するには、GDALが必要です。


警告

シェープファイルなどのGISデータソースは非常に大きい場合があります。 LayerMapping が使用しているメモリが多すぎる場合は、設定で:setting: `DEBUG`Falseに設定してください。 :setting: `DEBUG`Trueに設定されている場合、Django は自動的に すべての SQLクエリをログに記録します。SQLステートメントにジオメトリが含まれている場合、通常よりも多くのメモリを消費する可能性があります。


  1. シェープファイルのようなGDALでサポートされているデータソースが必要です(ここでは、3つの機能を備えた単純なポリゴンシェープファイルtest_poly.shpを使用しています)。

    >>> from django.contrib.gis.gdal import DataSource
    >>> ds = DataSource('test_poly.shp')
    >>> layer = ds[0]
    >>> print(layer.fields) # Exploring the fields in the layer, we only want the 'str' field.
    ['float', 'int', 'str']
    >>> print(len(layer)) # getting the number of features in the layer (should be 3)
    3
    >>> print(layer.geom_type) # Should be 'Polygon'
    Polygon
    >>> print(layer.srs) # WGS84 in WKT
    GEOGCS["GCS_WGS_1984",
        DATUM["WGS_1984",
            SPHEROID["WGS_1984",6378137,298.257223563]],
        PRIMEM["Greenwich",0],
        UNIT["Degree",0.017453292519943295]]
  2. 次に、対応するDjangoモデルを定義します(必ず:djadmin: `migrate` を使用してください):

    from django.contrib.gis.db import models
    
    class TestGeo(models.Model):
        name = models.CharField(max_length=25) # corresponds to the 'str' field
        poly = models.PolygonField(srid=4269) # we want our model in a different SRID
    
        def __str__(self):
            return 'Name: %s' % self.name
  3. LayerMapping を使用して、すべての機能を抽出し、データベースに配置します。

    >>> from django.contrib.gis.utils import LayerMapping
    >>> from geoapp.models import TestGeo
    >>> mapping = {'name' : 'str', # The 'name' model field maps to the 'str' layer field.
                   'poly' : 'POLYGON', # For geometry fields use OGC name.
                   } # The mapping is a dictionary
    >>> lm = LayerMapping(TestGeo, 'test_poly.shp', mapping)
    >>> lm.save(verbose=True) # Save the layermap, imports the data.
    Saved: Name: 1
    Saved: Name: 2
    Saved: Name: 3

ここで、 LayerMapping は、3つのジオメトリを元の空間参照系(WGS84)のシェープファイルからGeoDjangoモデル(NAD83)の空間参照系に変換しました。 レイヤーに空間参照系が定義されていない場合は、source_srsキーワードと SpatialReference オブジェクトを使用して指定します。


LayerMapping API

class LayerMapping(model, data_source, mapping, layer=0, source_srs=None, encoding=None, transaction_mode='commit_on_success', transform=True, unique=True, using='default')

以下は、LayerMappingオブジェクトのインスタンス化中に使用される可能性のある引数とキーワードです。

口論 説明
model 地理モデル、インスタンスではありません
data_source OGRでサポートされているデータソースファイル(シェープファイルなど)へのパス。 django.contrib.gis.gdal.DataSource インスタンスも受け入れます。
mapping 辞書:キーはモデルフィールドに対応する文字列であり、値はOGR機能の文字列フィールド名に対応します。モデルフィールドが地理的である場合は、'POINT'などのOGRジオメトリタイプに対応する必要があります。 、'LINESTRING''POLYGON'
キーワード引数
layer データソースから使用するレイヤーのインデックス(デフォルトは0)
source_srs これを使用して、ソースSRSを手動で指定します(たとえば、一部のシェープファイルには'.prj'ファイルが付属していません)。 整数のSRID、WKTまたはPROJ文字列、および django.contrib.gis.gdal.SpatialReference オブジェクトが受け入れられます。
encoding OGRデータソース内の文字列の文字セットエンコーディングを指定します。 たとえば、'latin-1''utf-8'、および'cp437'はすべて有効なエンコードパラメータです。
transaction_mode 'commit_on_success'(デフォルト)または'autocommit'の場合があります。
transform これをFalseに設定すると、座標変換が無効になります。 つまり、ジオメトリは、データソースの元の状態から変更されずにデータベースに挿入されます。
unique これを指定されたモデルの名前または名前のタプルに設定すると、指定された名前にのみ固有のモデルが作成されます。 各フィーチャーの形状は、固有のモデルに関連付けられたコレクションに追加されます。 トランザクションモードを強制的に'autocommit'にします。
using 空間データをインポートするときに使用するデータベースを設定します。 デフォルトは'default'です。

バージョン3.2で変更: pathlib.Path data_sourceのサポートが追加されました。


save()キーワード引数

LayerMapping.save(verbose=False, fid_range=False, step=False, progress=False, silent=False, stream=sys.stdout, strict=False)

save()メソッドもキーワードを受け入れます。 これらのキーワードは、出力ロギング、エラー処理の制御、および特定の機能範囲のインポートに使用されます。

キーワード引数を保存する 説明
fid_range データソースからマップするために、(開始、終了)機能IDのスライスまたはタプルを設定できます。 つまり、このキーワードを使用すると、ユーザーは地理データソース内のフィーチャのサブセット範囲を選択的にインポートできます。
progress このキーワードを設定すると、処理されて正常に保存された機能の数を示すステータス情報が出力されます。 デフォルトでは、進行状況情報は処理された1000の機能ごとに出力されますが、このデフォルトは、このキーワードに整数を希望の間隔で設定することで上書きできます。
silent デフォルトでは、致命的でないエラー通知はsys.stdoutに出力されますが、このキーワードを設定して、これらの通知を無効にすることができます。
step 整数で設定すると、トランザクションはすべてのステップ間隔で発生します。 たとえば、step=1000の場合、1,000番目の機能、2,000番目の機能などの後にコミットが発生します。
stream ステータス情報はこのファイルハンドルに書き込まれます。 デフォルトではsys.stdoutを使用しますが、writeメソッドを持つすべてのオブジェクトがサポートされます。
strict モデルマッピングの実行は、最初に発生したエラーで停止します。 デフォルト値(False)の動作は、続行を試みることです。
verbose 設定されている場合、データベースで実行された各モデルの保存後に情報が出力されます。


トラブルシューティング

メモリ不足

このセクションの上部にある警告に記載されているように、DjangoはDEBUG=TrueのときにすべてのSQLクエリを保存します。 設定でDEBUG=Falseを設定すると、LayerMappingスクリプトの実行時に過剰なメモリ使用が停止するはずです。


MySQL:max_allowed_packetエラー

LayerMappingとMySQLを使用しているときに次のエラーが発生した場合:

OperationalError: (1153, "Got a packet bigger than 'max_allowed_packet' bytes")

次に、解決策は、MySQL構成のmax_allowed_packet設定の値を増やすことです。 たとえば、デフォルト値は1メガバイトのような低い値である可能性があります–設定は[mysqld]セクションのMySQLの構成ファイル(my.cnf)で変更される可能性があります。

max_allowed_packet = 10M