Как обработать загруженный файл KML в GeoDjango - PullRequest
0 голосов
/ 03 ноября 2011

Я написал подпрограмму строки cmd для импорта файла kml в приложение geoDjango, которое прекрасно работает, когда вы передаёте ему локально сохраненный путь к файлу KML (используя объект источника данных).

Сейчас я пишу диалоговое окно загрузки файлов, чтобы добиться того же. Это начало кода, который у меня есть, проблема в том, что объект 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

Ответы [ 2 ]

2 голосов
/ 04 ноября 2011

DataSource является оболочкой для C API GDAL и нуждается в реальном файле.Вам нужно будет записать свою загрузку где-нибудь на диске, для страховки, используя tempfile .Затем вы можете передать файл в DataSource.

1 голос
/ 04 ноября 2011

Вот предлагаемое решение с использованием временного файла. Я поместил код обработки в его собственную функцию, которая теперь называется.

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