我对Django来说相当新,并且已经坚持了一个多星期。我正在教自己如何编写代码并尝试使用映射数据创建个人网站。我正在尝试使用从html上的javascript地图中提取的数据,该数据被格式化为kml / xml字符串并存储在文本框中。
我无法使用映射资源(geodjango,postgis)获取kml字符串并将其放入数据库中。文档似乎非常有限,在互联网上搜索得很高。
以下是我所拥有的内容:
HTML
(地图)
将kml字符串放入文本区域的按钮
<input name="mapdata" type="button" value="Generate KML" onclick="convert_to_kml"/>
<textarea id="kmlString" style="blahblah"></textarea>
型号:
class JobMap(models.Model):
name = models.CharField(max_length=200)
description = models.CharField(max_length=200)
mpoly = models.GeometryCollectionField(srid=4326)
objects = models.GeoManager()
def __str__(self):
return self.name`
查看:
def map_import(request):
if request.method == 'POST':
map_data = request.POST.get('kmlString')
#Create a temp file of the string (I think it needs to be a temp file in order for ogr2ogr can read it)
f = request.FILES[map_data]
temp = tempfile.NamedTemporaryFile(delete=False)
temp.write(f.read())
temp.close()
JobMap.objects.raw('''ogr2ogr - f "PostgreSQL"
PG:"host=localhost user=user dbname=database password=password"
temp.name''')
我想将所有kml数据转换为postgis-尝试保留所有kml数据,例如样式,名称和描述。
GDAL提供了ogr2ogr来进行查询,但我无法理解如何正确地将其实现到要处理的视图中。这是正确的方向吗?我听说过名为libkml的GDAL驱动程序(将kml处理成postgis) - 但仍不确定如何正确使用它。
OR 我这样做错了吗?!?!没有办法用postgis的输入和输出来保存样式吗?
我希望这清楚地表明我想要实现的目标。
我会感谢任何帮助!!!而且,如果你需要花费太多的宝贵时间,我可以为你的时间提供资金。这表明了我的绝望。哈哈!
以下是文本框中的示例kml字符串(我已测试并正常工作):
<?xml version="1.0" encoding="UTF-8" ?> <kml >xmlns="http://www.opengis.net/kml/2.2"> <Document> <Style id="117025122580"> <PolyStyle> <color>4c262ED3</color> </PolyStyle> <LineStyle> <color>4c262ED3</color> <width><![CDATA[3]]></width> </LineStyle> </Style> <Placemark> <name><![CDATA[]]></name> <description><![CDATA[]]></description> <styleUrl>#117025122580</styleUrl> <Polygon> <outerBoundaryIs> <LinearRing> <coordinates> -113.54164123535156,53.58616198075974,0 -113.40980529785156,53.57678609766098,0 -113.42559814453125,53.50823829699392,0 -113.58283996582031,53.53436483388852,0 -113.59451293945312,53.5559886770827,0 </coordinates> </LinearRing> </outerBoundaryIs> </Polygon> </Placemark> <Style id="117025122581"> <PolyStyle> <color>4c262ED3</color> </PolyStyle> <LineStyle> <color>4c262ED3</color> <width><![CDATA[3]]></width> </LineStyle> </Style> <Placemark> <name><![CDATA[]]></name> <description><![CDATA[]]></description> <styleUrl>#117025122581</styleUrl> <Polygon> <outerBoundaryIs> <LinearRing> <coordinates> -113.642578125,53.47678344938643,0 -113.55400085449219,53.47678344938643,0 -113.55400085449219,53.5282428724319,0 -113.642578125,53.5282428724319,0 </coordinates> </LinearRing> </outerBoundaryIs> </Polygon> </Placemark> <Style id="117025122582"> <IconStyle> <scale>1</scale> </IconStyle> </Style> <Placemark> <name><![CDATA[]]></name> <description><![CDATA[]]></description> <styleUrl>#117025122582</styleUrl> <Point> <coordinates>-113.47984313964844,53.61264779961176,0</coordinates> </Point> </Placemark> </Document> </kml>
答案 0 :(得分:2)
您可以使用DataSource
来读取KML文件,并从中提取geoms:
from django.contrib.gis.gdal.datasource import DataSource
ds = DataSource("data.kml")
geoms = ds[0].get_geoms(geos=True)
但是,这不适用于您的KML,因为多边形没有正确关闭(这可能适用于KML,但不适用于GEOS。删除geos=True
会将其正确加载为GDAL几何)。尝试其他KML examples here。
使用DataSource会丢失样式信息。您可以使用libkml或lxml提取它。
如果您的数据包含点,线和多边形的混合,请考虑使用GeometryCollection
字段而不是MultiPolygon
字段。