0

kml ファイルを geoDjango アプリケーションにインポートする cmd ライン ルーチンを作成しました。これは、ローカルに保存された KML ファイル パスを (データソース オブジェクトを使用して) フィードすると正常に動作します。

今、同じことを達成するために、Web ファイルのアップロード ダイアログを作成しています。これは私が持っているコードの始まりです。問題は、GDAL DataSource オブジェクトが Djangos UploadedFile 形式を理解していないように見えることです。これはメモリに保持され、期待どおりのファイル パスではありません。

UploadedFile を通常のファイルに変換し、パスを介してこれにアクセスするための最良の戦略は何でしょうか? 処理後にファイルを保持したくありません。

def createFeatureSet(request):
if request.method == 'POST':
    inMemoryFile = request.FILES['myfile']
    name = inMemoryFile.name
    POSTGIS_SRID = 900913
    ds = DataSource(inMemoryFile) #This line doesnt work!!! 
    for layer in ds:
        if layer.geom_type in (OGRGeomType('Point'), OGRGeomType('Point25D'), OGRGeomType('MultiPoint'), OGRGeomType('MultiPoint25D')):
            layerGeomType = OGRGeomType('MultiPoint').django
        elif layer.geom_type in (OGRGeomType('LineString'),OGRGeomType('LineString25D'), OGRGeomType('MultiLineString'), OGRGeomType('MultiLineString25D')):
            layerGeomType = OGRGeomType('MultiLineString').django
        elif layer.geom_type in (OGRGeomType('Polygon'), OGRGeomType('Polygon25D'), OGRGeomType('MultiPolygon'), OGRGeomType('MultiPolygon25D')):
             layerGeomType = OGRGeomType('MultiPolygon').django
4

2 に答える 2

2

DataSource は GDAL の C API のラッパーであり、実際のファイルが必要です。たとえば、 tempfileを使用して、アップロードをディスクのどこかに書き込む必要があります。次に、ファイルを DataSource に渡すことができます。

于 2011-11-04T09:59:12.403 に答える
1

一時ファイルを使用した推奨ソリューションを次に示します。処理コードを、現在呼び出されている独自の関数に入れました。

    f = request.FILES['myfile']
    temp = tempfile.NamedTemporaryFile(delete=False)
    temp.write(f.read())
    temp.close()
    createFeatureSet(temp.name, source_SRID= 900913)
于 2011-11-04T10:45:50.720 に答える