如何生成具有嵌套属性和基数大于1的属性的KML

时间:2018-09-19 21:35:48

标签: kml

我有一组要导出到KML的事件。这些事件具有嵌套的属性和基数大于1的属性(maxOccur> 1)。

这是一个以JSON表示的事件的示例:

{
    "id": 1,
    "date": "2018-01-01",
    "client": {
        "name": "Brad",
        "since": "2017-12-01"
    },
    "products": [
        {
            "name": "P1",
            "quantity": 20
        },
        {
            "name": "P2",
            "quantity": 40
        },
    ]
}

我们正在考虑的一个选项是在ExtendedData中使用任意XML。此选项听起来对机器到机器的数据交换很有用,但对人工读取却不利,因为“ Google地球”无法在气球中很好地显示这些数据:

<ExtendedData>
    <id>1</id>
    <date>2018-01-01</date>
    <client>
        <name>Brad</name>
        <since>2017-12-01</since>
    </client>
    <products>
        <product>
            <name>P1</name>
            <quantity>20</quantity>
        </product>
        <product>
            <name>P2</name>
            <quantity>40</quantity>
        </product>
    </products>
</ExtendedData>

我们正在考虑的其他选项是使用Schema + SchemaData + BallonStyle,但是不支持基数和嵌套属性...

<Schema name="myEvent" id="myEvent">     
    <SimpleField type="int" name="id">       
        <displayName>Event id</displayName>     
    </SimpleField>
    <SimpleField type="string" name="date">       
        <displayName>Event date</displayName>     
    </SimpleField>

    <!-- workaround to nested data -->
    <SimpleField type="string" name="clientName">       
        <displayName>Client name</displayName>     
    </SimpleField>
    <SimpleField type="string" name="clientSince">       
        <displayName>Client since</displayName>     
    </SimpleField>

    <!-- no idea how present attributes with more than one occurrence -->
</Schema>

还有另一个我们应该考虑的选择吗?

1 个答案:

答案 0 :(得分:2)

KML ExtendedData中的数据和SimpleData元素仅限于名称/值对,其值以文本形式出现,但允许使用不同的名称空间来定制XML。

您可以从非KML XML名称空间(例如Dublin核心,RDF或您自己的名称空间)向KML中的功能添加任意XML数据。这是相关的tutorial

以下是在KML中使用任意都柏林核心XML的示例:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
    <Document>
        <name>ExtendedData Test with Dublin core XML</name>
        <Placemark>
            <name>Test data</name>
            <ExtendedData xmlns:ns="http://example.org/myapp/">
                <ns:metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
                 <dc:description>
      KML features a rich mix of
      metadata information and services for the XML community.
                 </dc:description>
                 <dc:subject>XML, RDF, metadata, information
                  syndication services</dc:subject>
                 <dc:identifier>http://earth.google.com</dc:identifier>    
                 <dc:language>en-us</dc:language>
                 <dc:date>2000-10-13</dc:date>
                 <dc:rights>Copyright 2000, O'Reilly Network</dc:rights>
                 <dc:publisher>O'Reilly and Associates, Inc.</dc:publisher>
                </ns:metadata>
            </ExtendedData>
            <Point>
                <coordinates>-71.7571,42.953</coordinates>
            </Point>
        </Placemark>
    </Document>
</kml>

使用您自己的命名空间,您可以存储任何嵌套的XML。

<Placemark>
   <name>Test data</name>
   <ExtendedData>
    <data xmlns="urn:my.org:data"> 
     <id>1</id>
     <date>2018-01-01</date>
     <client>
        <name>Brad</name>
        <since>2017-12-01</since>
     </client>
     <products>
        <product>
            <name>P1</name>
            <quantity>20</quantity>
        </product>
        <product>
            <name>P2</name>
            <quantity>40</quantity>
        </product>
     </products>
   </data>
   </ExtendedData>
</Placemark>

但是请注意,由于Google Earth既不处理也不显示此类数据,因此该方法沿KML传递数据进行机器对机器交换。第三方应用程序可以利用KML中包含的这种XML数据。

如果您希望至少部分数据可以通过Google Earth进行人类阅读,请考虑使用混合解决方案,其中在Data / value元素中使用名称/值对(用于简单值),在定制XML元素中用于更复杂的嵌套XML数据。

    <Placemark>
        <name>Test data</name>
        <ExtendedData>
            <Data name="id">
                <value>123</value>
            </Data>
            <Data name="date">
                <value>2018-01-01</value>
            </Data>
            <customData xmlns="urn:custom">
                <client>
                    <name>Brad</name>
                    <since>2017-12-01</since>
                </client>
            </customData>
        </ExtendedData>
        <Point>
            <coordinates>-71.7571,42.953</coordinates>
        </Point>
    </Placemark>