2011-11-03 70 views
0

處理上傳的KML文件我寫的CMD線例行導入KML文件到GeoDjango內置應用程序,當你給它本地保存的KML文件路徑(使用數據源對象)的正常工作。如何GeoDjango內置

現在我正在編寫一個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 

回答

1

這是使用tempfile的建議解決方案。我將處理代碼放在現在稱爲自己的函數中。

f = request.FILES['myfile'] 
    temp = tempfile.NamedTemporaryFile(delete=False) 
    temp.write(f.read()) 
    temp.close() 
    createFeatureSet(temp.name, source_SRID= 900913) 
2

DataSource是GDAL的C API的包裝,需要一個實際的文件。您需要在磁盤上的某個位置編寫上傳文件,以便使用tempfile。然後您可以將該文件傳遞給DataSource。

+0

好吧用tempfile制定了一個工作解決方案,如下所示: – petzlux