0

我编写了一个 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
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 回答