LayerMappingデータインポートユーティリティ—Djangoドキュメント
LayerMappingデータインポートユーティリティ
LayerMapping クラスは、ベクトル空間データファイルのコンテンツをマップする方法を提供します(例: シェープファイル)をGeoDjangoモデルに変換します。
このユーティリティは、ベクターレイヤーからジオメトリとフィールドを引き出し、別の座標系に変換するコードの繰り返しを排除するという作者の個人的なニーズから生まれました(例: WGS84)、GeoDjangoモデルに挿入します。
警告
シェープファイルなどのGISデータソースは非常に大きい場合があります。 LayerMapping が使用しているメモリが多すぎる場合は、設定で:setting: `DEBUG` をFalse
に設定してください。 :setting: `DEBUG` がTrue
に設定されている場合、Django は自動的に すべての SQLクエリをログに記録します。SQLステートメントにジオメトリが含まれている場合、通常よりも多くのメモリを消費する可能性があります。
例
シェープファイルのような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]]
次に、対応する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
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.4文字列、および django.contrib.gis.gdal.SpatialReference オブジェクトが受け入れられます。
|
encoding
|
OGRデータソース内の文字列の文字セットエンコーディングを指定します。 たとえば、'latin-1' 、'utf-8' 、および'cp437' はすべて有効なエンコードパラメータです。
|
transaction_mode
|
'commit_on_success' (デフォルト)または'autocommit' の場合があります。
|
transform
|
これをFalseに設定すると、座標変換が無効になります。 つまり、ジオメトリは、データソースの元の状態から変更されずにデータベースに挿入されます。 |
unique
|
これを指定されたモデルの名前または名前のタプルに設定すると、指定された名前にのみ固有のモデルが作成されます。 各フィーチャーの形状は、固有のモデルに関連付けられたコレクションに追加されます。 トランザクションモードを強制的に'autocommit' にします。
|
using
|
空間データをインポートするときに使用するデータベースを設定します。 デフォルトは'default' です。
|
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