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