c++ 解析生成kml的库 libkml

libkml是google解析生成kml的库,很好用。

地址:安装源码下载 https://github.com/google/libkml/wiki/Building-and-installing-libkml

库下载:https://cbs.centos.org/koji/buildinfo?buildID=13972

使用例子:下面是输出点的例子

  kmldom::KmlFactory* factory = kmldom::KmlFactory::GetFactory();
     kmldom::DocumentPtr document = factory->CreateDocument();

     kmldom::StylePtr oneStyle = factory->CreateStyle();
     oneStyle->set_id("point style");
     kmldom::IconStylePtr iconStyle = factory->CreateIconStyle();
     iconStyle->set_color((kmlbase::Color32)aValue.styleColorLine);
     iconStyle->set_scale(aValue.scale);

     kmldom::IconStyleIconPtr icon = factory->CreateIconStyleIcon();
     icon->set_href("http://maps.google.com/mapfiles/kml/shapes/shaded_dot.png");
     iconStyle->set_icon(icon);
     kmldom::ListStylePtr listStyle = factory->CreateListStyle();
     listStyle->set_bgcolor((kmlbase::Color32)aValue.styleColorLine);
     oneStyle->set_liststyle(listStyle);
     kmldom::LabelStylePtr labelStyle = factory->CreateLabelStyle();

     string::size_type position;
     position = aValue.placeName.find("speed");
     if (position != aValue.placeName.npos)
     {
         labelStyle->set_scale(0.7);
     }
     else
     {
         labelStyle->set_scale(0);
     }

     oneStyle->set_labelstyle(labelStyle);
     oneStyle->set_iconstyle(iconStyle);

     document->add_styleselector(oneStyle);

     for(auto item : aVecPoints)
     {
         kmldom::PlacemarkPtr placemark = factory->CreatePlacemark();
         kmldom::CoordinatesPtr coordinates = factory->CreateCoordinates();
         coordinates->add_latlngalt(item.lat,item.lon,item.elevation);
         kmldom::PointPtr point = factory->CreatePoint();
         point->set_coordinates(coordinates);
         placemark->set_name(item.name);
         placemark->set_description(item.description);
         placemark->set_geometry(point);
         placemark->set_styleurl("point style");
         document->add_feature(placemark);
     }

     kmldom::KmlPtr kml = factory->CreateKml();
     kml->set_feature(document);
     kmlengine::KmlFilePtr kml_file =  kmlengine::KmlFile::CreateFromImport(kml);
     std::string xml1;
     kml_file->SerializeToString(&xml1);

     std::ofstream	OsWrite(aSaveFileName,std::ofstream::out);
     OsWrite<<xml1;
     OsWrite<<std::endl;
     OsWrite.close();

写线:

kmldom::KmlFactory* factory = kmldom::KmlFactory::GetFactory();
    kmldom::DocumentPtr document = factory->CreateDocument();

    kmldom::StylePtr oneStyle = factory->CreateStyle();
    oneStyle->set_id("line_style");
    kmldom::LineStylePtr lineStyle = factory->CreateLineStyle();
    lineStyle->set_color((kmlbase::Color32)aValue.styleColorLine);
    lineStyle->set_width(aValue.styleWidth);
    kmldom::PolyStylePtr polyStyle = factory->CreatePolyStyle();
    polyStyle->set_color((kmlbase::Color32)aValue.styleColorPoly);
    oneStyle->set_linestyle(lineStyle);
    oneStyle->set_polystyle(polyStyle);
    document->add_styleselector(oneStyle);

    for(auto vecItem : pointsList)
    {
        kmldom::PlacemarkPtr placemark = factory->CreatePlacemark();
        placemark->set_name("line mark");
        placemark->set_description("line mark description");
        placemark->set_styleurl("line_style");
        kmldom::LineStringPtr lineString = factory->CreateLineString();
        lineString->set_tessellate(true);
        lineString->set_extrude(true);

        if(vecItem.size() > 0)
        {
            placemark->set_name(vecItem[vecItem.size() -1].name);
            placemark->set_description(vecItem[vecItem.size() -1].description);
        }
        else
        {
            continue;
        }

        kmldom::CoordinatesPtr coordinates = factory->CreateCoordinates();
        for(auto item : vecItem)
        {
            coordinates->add_latlngalt(item.lat,item.lon,item.elevation);
            lineString->set_coordinates(coordinates);
        }

        placemark->set_geometry(lineString);
        document->add_feature(placemark);
    }

    kmldom::KmlPtr kml = factory->CreateKml();
    kml->set_feature(document);
    kmlengine::KmlFilePtr kml_file =  kmlengine::KmlFile::CreateFromImport(kml);
    std::string xml1;
    kml_file->SerializeToString(&xml1);

    std::ofstream	OsWrite(aSaveFileName,std::ofstream::out);
    OsWrite<<xml1;
    OsWrite<<std::endl;
    OsWrite.close();

 

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Java中可以使用JAKlibkml-java来生成KML文件。 1. 使用JAK JAK是一个用于生成解析KML文件的Java。它提供了很多方法来构建KML文件,并且支持所有KML标签和元素。 以下是一个简单的示例代码,演示如何使用JAK生成一个KML文件: ```java import de.micromata.opengis.kml.v_2_2_0.*; public class KMLGenerator { public static void main(String[] args) { // 创建KML文档 Kml kml = new Kml(); Document document = kml.createAndSetDocument().withName("My KML Document"); // 创建Placemark Placemark placemark = document.createAndAddPlacemark(); placemark.withName("My Placemark").withDescription("This is my placemark"); // 添加点坐标 Coordinate coord = new Coordinate(10.0, 20.0); placemark.createAndSetPoint().addToCoordinates(coord); // 保存KML文件 kml.marshal(new File("path/to/my.kml")); } } ``` 2. 使用libkml-java libkml-java是Google开发的一个用于处理KML和KMZ文件C++的Java绑定。它提供了Java类来生成解析KML文件,并且支持所有KML标签和元素。 以下是一个简单的示例代码,演示如何使用libkml-java生成一个KML文件: ```java import com.google.common.io.Files; import com.google.kml.Kml; import com.google.kml.Placemark; import com.google.kml.Point; import com.google.kml.coordinates.Coordinate; public class KMLGenerator { public static void main(String[] args) { // 创建KML文档 Kml kml = new Kml(); Placemark placemark = new Placemark().withName("My Placemark").withDescription("This is my placemark"); // 添加点坐标 Coordinate coord = new Coordinate(10.0, 20.0); Point point = new Point().addToCoordinates(coord); placemark.setGeometry(point); // 添加Placemark到KML文档 kml.setFeature(placemark); // 保存KML文件 try { Files.write(kml.toString().getBytes(), new File("path/to/my.kml")); } catch (IOException e) { e.printStackTrace(); } } } ``` 以上两种方法都可以用来生成KML文件,具体选择哪种方法取决于你的需求和个人偏好。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值