如何在GeoDjango中处理上传的KML文件

时间:2011-11-03 18:27:25

标签: django geodjango gdal

我编写了一个cmd行例程,将kml文件导入到geoDjango应用程序中,当你将它提供给本地保存的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

2 个答案:

答案 0 :(得分:2)

DataSource是GDAL的C API的包装器,需要一个实际的文件。您需要在磁盘上的某个位置编写上传内容,以便使用tempfile进行检测。然后,您可以将文件传递给DataSource。

答案 1 :(得分:1)

以下是使用临时文件的建议解决方案。我将处理代码放在它自己的函数中,现在调用它。

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