我有 4 個帶有多個多邊形的 KML 檔案。我想決議 KML 檔案,提取資料,然后將其存盤到我的資料庫中。經過研究,我認為決議 KML 檔案的最佳方法是安裝 pyKML。
我的一個 KML 檔案如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
<name>RecAreaPolygons.TAB</name>
<Schema name="RecAreaPolygons" id="S_RecAreaPolygons_SSSS">
<SimpleField type="string" name="RecAreaName"><displayName><b>RecAreaName</b></displayName>
</SimpleField>
<SimpleField type="string" name="RecAreaCategory"><displayName><b>RecAreaCategory</b></displayName>
</SimpleField>
<SimpleField type="string" name="Province"><displayName><b>Province</b></displayName>
</SimpleField>
<SimpleField type="string" name="Comments"><displayName><b>Comments</b></displayName>
</SimpleField>
</Schema>
<Style id="style1">
<BalloonStyle>
<text><![CDATA[<table border="0">
<tr><td><b>RecAreaName</b></td><td>$[RecAreaPolygons/RecAreaName]</td></tr>
<tr><td><b>RecAreaCategory</b></td><td>$[RecAreaPolygons/RecAreaCategory]</td></tr>
<tr><td><b>Province</b></td><td>$[RecAreaPolygons/Province]</td></tr>
<tr><td><b>Comments</b></td><td>$[RecAreaPolygons/Comments]</td></tr>
</table>
]]></text>
</BalloonStyle>
<PolyStyle>
<color>ff00ff00</color>
</PolyStyle>
</Style>
<Style id="falseColor">
<BalloonStyle>
<text><![CDATA[<table border="0">
<tr><td><b>RecAreaName</b></td><td>$[RecAreaPolygons/RecAreaName]</td></tr>
<tr><td><b>RecAreaCategory</b></td><td>$[RecAreaPolygons/RecAreaCategory]</td></tr>
<tr><td><b>Province</b></td><td>$[RecAreaPolygons/Province]</td></tr>
<tr><td><b>Comments</b></td><td>$[RecAreaPolygons/Comments]</td></tr>
</table>
]]></text>
</BalloonStyle>
<PolyStyle>
<colorMode>random</colorMode>
</PolyStyle>
</Style>
<Folder id="layer 0">
<name>RecAreaPolygons</name>
<Placemark>
<name>Whistler</name>
<styleUrl>#falseColor</styleUrl>
<Style id="inline">
<IconStyle>
<color>ff0000ff</color>
<colorMode>normal</colorMode>
</IconStyle>
<LineStyle>
<color>ff0000ff</color>
<colorMode>normal</colorMode>
</LineStyle>
<PolyStyle>
<color>ff0000ff</color>
<colorMode>normal</colorMode>
</PolyStyle>
</Style>
<ExtendedData>
<SchemaData schemaUrl="#S_RecAreaPolygons_SSSS">
<SimpleData name="RecAreaName">Whistler</SimpleData>
<SimpleData name="RecAreaCategory">World Class</SimpleData>
<SimpleData name="Province">BC</SimpleData>
<SimpleData name="Comments"></SimpleData>
</SchemaData>
</ExtendedData>
<Polygon>
<outerBoundaryIs>
<LinearRing>
<coordinates>
-123.052382,50.094969,0 -123.050613,50.07531199999999,0 -123.029976,50.05263099999998,0 -122.955094,50.045827,0 -122.909104,50.05565599999998,0 -122.869599,50.07871399999998,0 -122.835991,50.10895600000001,0 -122.826557,50.152805,0 -122.78496,50.26872300000001,0 -122.923014,50.26576299999998,0 -122.939174,50.18569200000002,0 -122.979858,50.17057199999998,0 -123.012877,50.151293,0 -123.050613,50.12483200000001,0 -123.053561,50.104419,0 -123.052382,50.094969,0
</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
//MULTIPLE OTHER PLACEMARKS
正如我所提到的,我的嘗試是安裝 pyKML,安裝后,我運行以下代碼將其存盤到資料框中:
with open('RecAreaPolygons.kml', 'rb') as f:
s = f.read()
root = parser.fromstring(s)
print(root.Document.Folder.Placemark.Polygon.outerBoundaryIs.LinearRing.coordinates)
我可以列印第一個地標的坐標,但是如何接收其余的并迭代地將其添加到資料框中?
最好,我希望我的輸出看起來像:
RecAreaName RecAreaCategory Province Comments Coordinates
0 Whistler World Class BC -123.052382,50.094969,0 -123.050613,50.07531199999999,0 -123.029976,50.05263099999998,0 -122.955094,50.045827,0 -122.909104,50.05565599999998,0 -122.869599,50.07871399999998,0 -122.835991,50.10895600000001,0 -122.826557,50.152805,0 -122.78496,50.26872300000001,0 -122.923014,50.26576299999998,0 -122.939174,50.18569200000002,0 -122.979858,50.17057199999998,0 -123.012877,50.151293,0 -123.050613,50.12483200000001,0 -123.053561,50.104419,0 -123.052382,50.094969,0
1 The rest of the entries
2
uj5u.com熱心網友回復:
您可以遍歷地標,將名稱和幾何圖形添加到串列中。然后從串列中創建一個資料框。
如果 KML 有多個檔案夾,那么您將需要遍歷檔案夾,然后在檔案夾中添加地標。
from pykml import parser
import pandas as pd
with open('RecAreaPolygons.kml', 'r', encoding="utf-8") as f:
root = parser.parse(f).getroot()
places = []
for place in root.Document.Folder.Placemark:
coords = place.Polygon.outerBoundaryIs.LinearRing.coordinates.text.strip()
data = {item.get("name"): item.text for item in
place.ExtendedData.SchemaData.SimpleData}
places.append({"RecAreaName ": data.get('RecAreaName'),
"RecAreaCategory": data.get('RecAreaCategory'),
"Province": data.get('Province'),
"Comments": data.get('Comments'),
"Coordinates": coords})
df = pd.DataFrame(places)
print(df)
輸出:
RecAreaName RecAreaCategory Province Comments Coordinates
0 Whistler World Class BC None -123.052382,50.094969,0, -123.050613,50.07531...
如果希望 coords 成為一個串列,則在 strip() 呼叫之后添加到回圈中的coords.split(' ')變數的賦值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/426905.html
標籤:Python python-3.x 熊猫 文件 公里
