0

我手动编写了一个 KML 文件,试图在 MyMaps 中导入一些多边形。这种方式工作正常:

<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://earth.google.com/kml/2.0">
    <Document>
        <Placemark> 
            <Style> 
                <PolyStyle>  
                    <color>#a00000ff</color>
                    <outline>0</outline>
                </PolyStyle> 
            </Style>
            <Polygon>
                <outerBoundaryIs>
                    <LinearRing>  
                        <coordinates>9.184254,45.443636 9.183379,45.434288 9.224836,45.431499 9.184254,45.443636</coordinates>
                    </LinearRing>
                </outerBoundaryIs>
            </Polygon>
        </Placemark>
    </Document>
</kml>

我尝试使用生成最可能相等文件的 JAK 编写一个 java 程序,但它不适用于 Maps

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns3:kml xmlns:atom="http://www.w3.org/2005/Atom" xmlns:ns3="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:xal="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0">
    <ns3:Document>
        <ns3:Placemark>
            <ns3:Style>
                <ns3:PolyStyle>
                    <ns3:color>#EABCFF</ns3:color>
                    <ns3:outline>0</ns3:outline>
                </ns3:PolyStyle>
            </ns3:Style>
            <ns3:Polygon>
                <ns3:innerBoundaryIs>
                    <ns3:LinearRing>
                        <ns3:coordinates>9.184254,45.443636 9.183379,45.434288 9.224836,45.431499 9.184254,45.443636</ns3:coordinates>
                    </ns3:LinearRing>
                </ns3:innerBoundaryIs>
            </ns3:Polygon>
        </ns3:Placemark>
    </ns3:Document>
</ns3:kml>

那是程序:

public static void main(String[] args) throws IOException {
    // Style
    PolyStyle polystyle = KmlFactory.createPolyStyle();
    polystyle.setColor("#EABCFF");
    // polystyle.setFill(true);
    polystyle.setOutline(false);
    //
    Kml kml = KmlFactory.createKml();
    Document document = kml.createAndSetDocument();
    Placemark pm = document.createAndAddPlacemark();
    LinearRing linearRing = pm.createAndSetPolygon().createAndAddInnerBoundaryIs().createAndSetLinearRing();
    linearRing.addToCoordinates(9.184254, 45.443636, 0);
    linearRing.addToCoordinates(9.183379, 45.434288, 0);
    linearRing.addToCoordinates(9.224836, 45.431499, 0);
    linearRing.addToCoordinates(9.184254, 45.443636, 0);
    pm.createAndAddStyle().setPolyStyle(polystyle);
    //
    kml.marshal(new FileWriter("D:/prova.kml"));
}
4

2 回答 2

0

<ns3:在你的 kml 中查看,这使得 kml 对谷歌地图无效

尝试更正文件

于 2015-05-29T16:15:47.993 回答
0

我有同样的问题。

而不是使用kml.marshal(new FileWriter("D:/prova.kml"));我这样做......

        String name = kml.getClass().getSimpleName();
        if ("Kml".equals(name)) {
            name = name.toLowerCase();
        }

        JAXBContext jaxbContext = JAXBContext.newInstance(Kml.class);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

        // output pretty printed
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        jaxbMarshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new NameSpaceBeautyfier());
        JAXBElement<Kml> jaxbKml = new JAXBElement<>(new QName("http://www.opengis.net/kml/2.2", name), (Class<Kml>) kml.getClass(), kml);
        jaxbMarshaller.marshal(jaxbKml, file);

使用这样的 NameSpaceBeautifier ...

private static final class NameSpaceBeautyfier extends NamespacePrefixMapper {

    private static final String KML_PREFIX = ""; // DEFAULT NAMESPACE
    private static final String KML_URI= "http://www.opengis.net/kml/2.2";

    @Override
    public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
        if(KML_URI.equals(namespaceUri)) {
            return KML_PREFIX;
        }
        return suggestion;
    }

    @Override
    public String[] getPreDeclaredNamespaceUris() {
        return new String[] { KML_URI };
    }

    private NameSpaceBeautyfier() {
    }
}

希望这可以帮助..

于 2016-05-03T13:20:23.243 回答