GeoXML3 访问 KML 属性数据
GeoXML3 accessing KML attribute datas
我的 KML 文件格式如下:
<Placemark>
<Style><LineStyle><color>ff0000ff</color></LineStyle><PolyStyle><fill>0</fill></PolyStyle></Style>
<ExtendedData><SchemaData schemaUrl="#seb">
<SimpleData name="PR0">CORS</SimpleData>
<SimpleData name="PR1">BRB</SimpleData>
<SimpleData name="PR2">F15</SimpleData>
</SchemaData></ExtendedData>
<MultiGeometry><Polygon><altitudeMode>clampToGround</altitudeMode><outerBoundaryIs><LinearRing><altitudeMode>clampToGround</altitudeMode><coordinates>71.0035714700001,38.4757616580001 71.0567352510001,38.398144523 71.1035044220001,38.422803406000138.4764993150001 71.0035714700001,38.4757616580001</coordinates></LinearRing></outerBoundaryIs></Polygon></MultiGeometry>
我希望能够从 kml 访问扩展数据字段,我将使用它来进一步处理和索引多边形以供以后使用和搜索。
正如这个 post 所述,变量可以从 placemark.vars.val 访问,但我无法得到它,因为 vars 是未定义的。
Load kml extendeddata into variable with Geoxml3
目前 geoxml3 的 kmz 分支以 KML Reference
中定义的格式处理 ExtendedData
如果您将 KML 修改为该格式(<Data>
而不是 <SimpleData>
,值周围的 <value>
标记),它将按原样工作。
<Placemark>
<Style>
<LineStyle><color>ff0000ff</color><width>2</width></LineStyle>
<PolyStyle><fill>0</fill></PolyStyle>
<BalloonStyle>
<text>
<![CDATA[$[name]<br>PR0: $[PR0]<br>PR1: $[PR1]<br>PR2: $[PR2]]]>
</text>
</BalloonStyle>
</Style>
<ExtendedData>
<SchemaData schemaUrl="#seb">
<Data name="PR0">
<value>CORS</value>
</Data>
<Data name="PR1">
<value>BRB</value>
</Data>
<Data name="PR2">
<value>F15</value>
</Data></SchemaData>
</ExtendedData>
<MultiGeometry>
<Polygon>
<altitudeMode>clampToGround</altitudeMode>
<outerBoundaryIs><LinearRing>
<altitudeMode>clampToGround</altitudeMode>
<coordinates>71.0035714700001,38.4757616580001 71.0567352510001,38.398144523 71.1035044220001,38.422803406000138.4764993150001 71.0035714700001,38.4757616580001
</coordinates>
</LinearRing></outerBoundaryIs>
</Polygon>
</MultiGeometry>
</Placemark>
另一种选择是修改 geoxml3 以支持您格式中的 <SimpleData>
标签(它是开源的)。
代码片段:
var geocoder;
var map;
function initialize() {
var map = new google.maps.Map(
document.getElementById("map_canvas"), {
center: new google.maps.LatLng(37.4419, -122.1419),
zoom: 13,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var geoXml = new geoXML3.parser({
map: map,
singleInfoWindow: true
});
geoXml.parseKmlString(kmlStr);
}
google.maps.event.addDomListener(window, "load", initialize);
var kmlStr = '<Placemark><Style><LineStyle><color>ff0000ff</color><width>2</width></LineStyle><PolyStyle><fill>0</fill></PolyStyle><BalloonStyle><text><![CDATA[$[name]<br>PR0: $[PR0]<br>PR1: $[PR1]<br>PR2: $[PR2]]]></text></BalloonStyle></Style><ExtendedData><SchemaData schemaUrl="#seb"><Data name="PR0"><value>CORS</value></Data><Data name="PR1"><value>BRB</value></Data><Data name="PR2"><value>F15</value></Data></SchemaData></ExtendedData><MultiGeometry><Polygon><altitudeMode>clampToGround</altitudeMode><outerBoundaryIs><LinearRing><altitudeMode>clampToGround</altitudeMode><coordinates>71.0035714700001,38.4757616580001 71.0567352510001,38.398144523 71.1035044220001,38.422803406000138.4764993150001 71.0035714700001,38.4757616580001</coordinates></LinearRing></outerBoundaryIs></Polygon></MultiGeometry></Placemark>';
html,
body,
#map_canvas {
height: 100%;
width: 100%;
margin: 0px;
padding: 0px
}
<script src="https://maps.googleapis.com/maps/api/js"></script>
<script src="https://cdn.rawgit.com/geocodezip/geoxml3/master/kmz/geoxml3.js"></script>
<div id="map_canvas"></div>
正在回复上面的 geocodezip 回复...
您的方法可行,但问题是频繁生成 kml。进行您提到的更改可能有点困难,因为 <SimpleData>
标记的内容包含预期格式为 <Data><value></value></Data>
的文本值。
最好的方法是创建一个 php 或任何解析 kml 并进行更改的程序。我决定编辑 GeoXML3.js 解析器以在第 639 行
处查找 SimpleData 而不是 Data 标记
var dataNodes = getElementsByTagName(extDataNodes[0], 'Data');
我的 KML 文件格式如下:
<Placemark>
<Style><LineStyle><color>ff0000ff</color></LineStyle><PolyStyle><fill>0</fill></PolyStyle></Style>
<ExtendedData><SchemaData schemaUrl="#seb">
<SimpleData name="PR0">CORS</SimpleData>
<SimpleData name="PR1">BRB</SimpleData>
<SimpleData name="PR2">F15</SimpleData>
</SchemaData></ExtendedData>
<MultiGeometry><Polygon><altitudeMode>clampToGround</altitudeMode><outerBoundaryIs><LinearRing><altitudeMode>clampToGround</altitudeMode><coordinates>71.0035714700001,38.4757616580001 71.0567352510001,38.398144523 71.1035044220001,38.422803406000138.4764993150001 71.0035714700001,38.4757616580001</coordinates></LinearRing></outerBoundaryIs></Polygon></MultiGeometry>
我希望能够从 kml 访问扩展数据字段,我将使用它来进一步处理和索引多边形以供以后使用和搜索。
正如这个 post 所述,变量可以从 placemark.vars.val 访问,但我无法得到它,因为 vars 是未定义的。
Load kml extendeddata into variable with Geoxml3
目前 geoxml3 的 kmz 分支以 KML Reference
中定义的格式处理ExtendedData
如果您将 KML 修改为该格式(<Data>
而不是 <SimpleData>
,值周围的 <value>
标记),它将按原样工作。
<Placemark>
<Style>
<LineStyle><color>ff0000ff</color><width>2</width></LineStyle>
<PolyStyle><fill>0</fill></PolyStyle>
<BalloonStyle>
<text>
<![CDATA[$[name]<br>PR0: $[PR0]<br>PR1: $[PR1]<br>PR2: $[PR2]]]>
</text>
</BalloonStyle>
</Style>
<ExtendedData>
<SchemaData schemaUrl="#seb">
<Data name="PR0">
<value>CORS</value>
</Data>
<Data name="PR1">
<value>BRB</value>
</Data>
<Data name="PR2">
<value>F15</value>
</Data></SchemaData>
</ExtendedData>
<MultiGeometry>
<Polygon>
<altitudeMode>clampToGround</altitudeMode>
<outerBoundaryIs><LinearRing>
<altitudeMode>clampToGround</altitudeMode>
<coordinates>71.0035714700001,38.4757616580001 71.0567352510001,38.398144523 71.1035044220001,38.422803406000138.4764993150001 71.0035714700001,38.4757616580001
</coordinates>
</LinearRing></outerBoundaryIs>
</Polygon>
</MultiGeometry>
</Placemark>
另一种选择是修改 geoxml3 以支持您格式中的 <SimpleData>
标签(它是开源的)。
代码片段:
var geocoder;
var map;
function initialize() {
var map = new google.maps.Map(
document.getElementById("map_canvas"), {
center: new google.maps.LatLng(37.4419, -122.1419),
zoom: 13,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var geoXml = new geoXML3.parser({
map: map,
singleInfoWindow: true
});
geoXml.parseKmlString(kmlStr);
}
google.maps.event.addDomListener(window, "load", initialize);
var kmlStr = '<Placemark><Style><LineStyle><color>ff0000ff</color><width>2</width></LineStyle><PolyStyle><fill>0</fill></PolyStyle><BalloonStyle><text><![CDATA[$[name]<br>PR0: $[PR0]<br>PR1: $[PR1]<br>PR2: $[PR2]]]></text></BalloonStyle></Style><ExtendedData><SchemaData schemaUrl="#seb"><Data name="PR0"><value>CORS</value></Data><Data name="PR1"><value>BRB</value></Data><Data name="PR2"><value>F15</value></Data></SchemaData></ExtendedData><MultiGeometry><Polygon><altitudeMode>clampToGround</altitudeMode><outerBoundaryIs><LinearRing><altitudeMode>clampToGround</altitudeMode><coordinates>71.0035714700001,38.4757616580001 71.0567352510001,38.398144523 71.1035044220001,38.422803406000138.4764993150001 71.0035714700001,38.4757616580001</coordinates></LinearRing></outerBoundaryIs></Polygon></MultiGeometry></Placemark>';
html,
body,
#map_canvas {
height: 100%;
width: 100%;
margin: 0px;
padding: 0px
}
<script src="https://maps.googleapis.com/maps/api/js"></script>
<script src="https://cdn.rawgit.com/geocodezip/geoxml3/master/kmz/geoxml3.js"></script>
<div id="map_canvas"></div>
正在回复上面的 geocodezip 回复...
您的方法可行,但问题是频繁生成 kml。进行您提到的更改可能有点困难,因为 <SimpleData>
标记的内容包含预期格式为 <Data><value></value></Data>
的文本值。
最好的方法是创建一个 php 或任何解析 kml 并进行更改的程序。我决定编辑 GeoXML3.js 解析器以在第 639 行
处查找 SimpleData 而不是 Data 标记var dataNodes = getElementsByTagName(extDataNodes[0], 'Data');