KML Entity Replacement in BalloonStyle Fails in Go

2019-07-26 04:47发布

Spent way too many hours debugging KML from within GEarth vs. Google Maps. Can someone give me a hint on why the following 'Entity Replacement' below works fine in GE but fails in GMaps.

I ran XMLValidate and the file is fine, but the tags in [CDATA] don't get replaced by GoogleMaps API, only in GEarth. I read the Best Practices KML docs on BalloonStyle entity replacement, and the mind-numbing description in the OGC KML 2.2 standard and tuned and trimmed the file, but I'm still stumped. I can't get Entity Replacement to work in GMaps API in the case below.

Any ideas? -Thanks

<?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>ParcelsJoinedx.kml</name>
        <Style id="outline">
            <PolyStyle>
                <color>00ff0000</color>
                <fill>1</fill>
                <outline>1</outline>
            </PolyStyle>
            <BalloonStyle>
                <bgColor>ffffffff</bgColor>
                <text>
                <![CDATA[
                    <head>
                    <title></title>
                    <STYLE TYPE="text/css">
                    <!-- TD{font-family: Arial; font-size: 9pt;} --->
                    </STYLE>
                    </head>
                    <body>
                      <table >
                      <tr><td valign='top'><font color="#aa0000">$[ParcelJoined/Location/displayName]:</font></td><td>$[ParcelJoined/Location]</td>
                      <tr><td><font color="#aa0000">$[ParcelJoined/ParcelID/displayName]:</font></td><td>$[ParcelJoined/ParcelID]</td>
                     </tr></table>
                     </body>
                     ]]>
                 </text>
            </BalloonStyle>
        </Style>
        <Schema name="ParcelJoined" id="ParcelJoinedID">
            <SimpleField type="string" name="Name"></SimpleField>
            <SimpleField type="string" name="Description"></SimpleField>
            <SimpleField type="string" name="Location">
                <displayName><![CDATA[<b>Location</b>]]></displayName>
            </SimpleField>
            <SimpleField type="string" name="ParcelID">
                <displayName><![CDATA[<b>ParcelID</b>]]></displayName>
            </SimpleField>
            <SimpleField type="string" name="Zone"></SimpleField>
            <SimpleField type="string" name="AssessArea"></SimpleField>
            <SimpleField type="string" name="Owner"></SimpleField>
            <SimpleField type="string" name="CoOwner"></SimpleField>
            <SimpleField type="string" name="Address1"></SimpleField>
            <SimpleField type="string" name="Address2"></SimpleField>
            <SimpleField type="string" name="City"></SimpleField>
            <SimpleField type="string" name="State"></SimpleField>
            <SimpleField type="string" name="ZIP"></SimpleField>
            <SimpleField type="string" name="AcctNum"></SimpleField>
            <SimpleField type="string" name="YearBuilt"></SimpleField>
            <SimpleField type="string" name="LandValue"></SimpleField>
            <SimpleField type="string" name="BldgValue"></SimpleField>
            <SimpleField type="string" name="OtherValue"></SimpleField>
            <SimpleField type="string" name="TotalValue"></SimpleField>
            <SimpleField type="string" name="MainBldgDesc"></SimpleField>
            <SimpleField type="string" name="StateCode"></SimpleField>
            <SimpleField type="string" name="SaleDate"></SimpleField>
            <SimpleField type="string" name="Rooms"></SimpleField>
            <SimpleField type="string" name="Beds"></SimpleField>
            <SimpleField type="string" name="Baths"></SimpleField>
        </Schema>
        <Folder>
            <name>ParcelJoinedFldr</name>
            <Placemark>
                <styleUrl>#outline</styleUrl>
                <ExtendedData>
                    <SchemaData schemaUrl="#ParcelJoinedID">
                        <SimpleData name="Location">68 WALCOTT AVE</SimpleData>
                        <SimpleData name="ParcelID">9-459</SimpleData>
                        <SimpleData name="Zone">R40$39</SimpleData>
                        <SimpleData name="AssessArea">3.72 AC</SimpleData>
                        <SimpleData name="Owner">CXXX, CXX R ET</SimpleData>
                        <SimpleData name="CoOwner">CXXX, GLXXA G</SimpleData>
                        <SimpleData name="Address1">32 EAST 88TH STREET</SimpleData>
                        <SimpleData name="Address2"></SimpleData>
                        <SimpleData name="City">NEW YORK</SimpleData>
                        <SimpleData name="State">NY</SimpleData>
                        <SimpleData name="ZIP">10021</SimpleData>
                        <SimpleData name="AcctNum">2421</SimpleData>
                        <SimpleData name="YearBuilt">1910</SimpleData>
                        <SimpleData name="LandValue">2036060</SimpleData>
                        <SimpleData name="BldgValue">479800</SimpleData>
                        <SimpleData name="OtherValue">1500</SimpleData>
                        <SimpleData name="TotalValue">2517360</SimpleData>
                        <SimpleData name="MainBldgDesc">CONVNTL</SimpleData>
                        <SimpleData name="StateCode">1100 - SEASONAL &amp; BEACH</SimpleData>
                        <SimpleData name="SaleDate">04/07/1995</SimpleData>
                        <SimpleData name="Rooms">0</SimpleData>
                        <SimpleData name="Beds">0</SimpleData>
                        <SimpleData name="Baths">4 Full / 0 H</SimpleData>
                    </SchemaData>
                </ExtendedData>
                <Polygon>
                    <outerBoundaryIs>
                        <LinearRing>
                            <coordinates>-71.363000752291924,41.489279023867283 -71.364928267362686,41.489246551445632 -71.364928271377551,41.48924655145035 -71.366127398895557,41.489226333780891 -71.366980322431843,41.489211945621989 -71.366980559667908,41.489218729506135 -71.366992415755973,41.489658359975031 -71.363335128398276,41.489691230204564 -71.36332242991972,41.489681182960041 -71.36320151947757,41.489583338563875 -71.363080572769988,41.489488329510586 -71.363012929798629,41.48940065703426 -71.363000855378388,41.489285011997865 -71.363000752291924,41.489279023867283</coordinates>
                        </LinearRing>
                    </outerBoundaryIs>
                </Polygon>
            </Placemark>
        </Folder>
    </Document>
</kml>

2条回答
The star\"
2楼-- · 2019-07-26 04:59

To answer your question about why this doesn't work in Google Maps: both <Schema> and <SchemaData> are officially unsupported by the Google Maps API. <Data> is fully supported and <ExtendedData> is partially supported (reference).

The reference provides a table detailing the KML features supported by the API. Here are the relevant rows:

+----------------+-----------------------+----------------------------+
|  KML element   | Supported in the API? |         Comment            |
+----------------+-----------------------+----------------------------+
| <BalloonStyle> | partially             | only <text> is supported   |
| <Data>         | yes                   |                            |
| <ExtendedData> | partially             | untyped <Data> only, no    |
|                |                       | <SimpleData> or <Schema>,  |
|                |                       | and entity replacements of |
|                |                       | the form $[dataName] are   |
|                |                       | not supported.             |
| <Schema>       | no                    |                            |
| <SchemaData>   | no                    |                            |
+----------------+-----------------------+----------------------------+

In case the link breaks it is the "Supported KML elements" section of the "KML and GeoRSS" guide in the Google Maps JavaScript API developer docs.

查看更多
The star\"
3楼-- · 2019-07-26 05:01

I think that it probably will work if you use simple <ExtendedData> and <Data> elements to provide the data, as well as or rather than <Schema> and <SchemaData> elements.

From looking at it, do you even need schema data? Are you using the KML in some other application that requires the data as typed strings?

Google Earth and Google maps ignore the type data, so it is just bloating your kml if it doesn't have some other purpose for you.

The first half of the document you linked to deals with this.

查看更多
登录 后发表回答