Android导出Kml

转载请注明出处:http://blog.csdn.net/hnyzwtf/article/details/51956714
请先阅读:

这里就直接给出代码了

package com.soil.soilsampling.ui.parsekml;

import android.content.Context;
import android.content.res.Resources;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;

import com.soil.soilsampling.R;
import com.soil.soilsampling.base.BaseApplication;
import com.soil.soilsampling.model.CoordinateAlterSample;
import com.soil.soilsampling.support.utils.ToastUtil;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * Created by GIS on 2016/5/19 0019.
 * 
 */
public class WriteKml {
    private String TAG = "WriteKml";

    /*
    * 传入两个参数,一是kml的名称,第二个是坐标点的list
    * */
    public void createKml(String kmlName, List<CoordinateAlterSample> alterSamples) throws Exception
    {
        Element root = DocumentHelper.createElement("kml");  //根节点是kml
        Document document = DocumentHelper.createDocument(root);
        //给根节点kml添加属性
        root.addAttribute("xmlns", "http://www.opengis.net/kml/2.2")
                .addAttribute("xmlns:gx", "http://www.google.com/kml/ext/2.2")
                .addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance")
                .addAttribute("xsi:schemaLocation",
                        "http://www.opengis.net/kml/2.2 http://schemas.opengis.net/kml/2.2.0/ogckml22.xsd http://www.google.com/kml/ext/2.2 http://code.google.com/apis/kml/schema/kml22gx.xsd");

        //给根节点kml添加子节点  Document
        Element documentElement = root.addElement("Document");

        documentElement.addElement("name").addText(kmlName); //添加name节点
        documentElement.addElement("Snippet").addText(""); //Snippet节点
        Element folderElement = documentElement.addElement("Folder");//Folder节点
        folderElement.addAttribute("id", "FeatureLayer0");
        //给Folder节点添加子节点
        folderElement.addElement("name").addText(kmlName);
        folderElement.addElement("Snippet").addText("");
        //循环添加每一个Placemark节点,有几个坐标点就有几个Placemark节点
        for (int i = 0; i < alterSamples.size(); i++) {
            Element placeMarkElement = folderElement.addElement("Placemark");
            placeMarkElement.addAttribute("id", alterSamples.get(i).getName());
            placeMarkElement.addElement("name").addText(alterSamples.get(i).getName());
            placeMarkElement.addElement("Snippet").addText("");
            placeMarkElement.addElement("description").addCDATA(getCdataContent(alterSamples.get(i).getName(),
                    alterSamples.get(i).getName(), String.valueOf(alterSamples.get(i).getX()), String.valueOf(alterSamples.get(i).getY()),
                    alterSamples.get(i).getCostValue()));
            placeMarkElement.addElement("styleUrl").addText("#IconStyle00");
            Element pointElement = placeMarkElement.addElement("Point");
            pointElement.addElement("altitudeMode").addText("clampToGround");
            //添加每一个坐标点的经纬度坐标
            //pointElement.addElement("coordinates").addText("119.39986000,31.13396700000143,0");
            pointElement.addElement("coordinates").addText(String.valueOf(alterSamples.get(i).getX()) + "," +
                    String.valueOf(alterSamples.get(i).getY()) + "," + "0");
        }
        Element styleElement = documentElement.addElement("Style");//Style节点
        styleElement.addAttribute("id", "IconStyle00");
        // IconStyle
        Element iconStyleElement = styleElement.addElement("IconStyle");
        Element iconElement = iconStyleElement.addElement("Icon");
        iconElement.addElement("href").addText("layer0_symbol.png");
        iconStyleElement.addElement("scale").addText("0.250000");
        // LabelStyle
        Element labelStyleElement = styleElement.addElement("LabelStyle");
        labelStyleElement.addElement("color").addText("00000000");
        labelStyleElement.addElement("scale").addText("0.000000");
        // PolyStyle
        Element polyStyleElement = styleElement.addElement("PolyStyle");
        polyStyleElement.addElement("color").addText("ff000000");
        polyStyleElement.addElement("outline").addText("0");

        //将生成的kml写出本地
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("utf-8");//设置编码格式
        //将doc.kml写入到/data/data/<package name>/files目录
        FileOutputStream outputStream = BaseApplication.getContext().openFileOutput("doc.kml", Context.MODE_PRIVATE);
        XMLWriter xmlWriter = new XMLWriter(outputStream,format);

        xmlWriter.write(document);

        xmlWriter.close();
        //开始对文件进行压缩,一个kml文件其实是一个压缩文件,里面包含一个kml文件和一个png图标

        String docKmlPath = BaseApplication.getContext().getFilesDir().getAbsolutePath() + "//doc.kml";

        zipWriteKml(docKmlPath, kmlName);
        ToastUtil.show(BaseApplication.getContext(), "导出kml成功");

    }
    /*
    * 将生成的kml文件和drawable下的某个png图标进行压缩,生成最终的kml文件,并保存在/data/data/<package name>/files目录
    * */
    public void zipWriteKml(String docKmlPath, String kmlName) throws IOException
    {
        // 最终生成的kml文件
        FileOutputStream fileOutput = BaseApplication.getContext().openFileOutput(kmlName + ".kmz", Context.MODE_PRIVATE);

        OutputStream os = new BufferedOutputStream( fileOutput);
        ZipOutputStream zos = new ZipOutputStream(os);
        byte[] buf = new byte[8192];
        int len;

        //压缩data/data/package name/files目录下的doc.kml
        File file = new File(docKmlPath);
        if ( !file.isFile() )
            Log.d(TAG, "doc.kml is nonexist");
        ZipEntry ze = new ZipEntry( file.getName() );
        zos.putNextEntry( ze );
        BufferedInputStream bis = new BufferedInputStream( new FileInputStream( file ) );
        while ( ( len = bis.read( buf ) ) > 0 ) {
            zos.write( buf, 0, len );

        }
        zos.closeEntry();


        // 压缩drawable目录下的图片
        Resources r = BaseApplication.getContext().getResources();
        Bitmap bitmap = BitmapFactory.decodeResource(r, R.drawable.layer0_symbol);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
        InputStream input = new ByteArrayInputStream(baos.toByteArray());
        int temp = 0;
        ZipEntry entry2 = new ZipEntry("layer0_symbol.png");
        zos.putNextEntry(entry2);
        while ((temp = input.read()) != -1)
        {
            zos.write(temp);
        }
        input.close();
        zos.closeEntry();

       /* for (int i=0;i < files.length;i++) {
            File file = new File(files[i]);
            if ( !file.isFile() )
                continue;
            ZipEntry ze = new ZipEntry( file.getName() );
            zos.putNextEntry( ze );
            BufferedInputStream bis = new BufferedInputStream( new FileInputStream( file ) );
            while ( ( len = bis.read( buf ) ) > 0 ) {
                zos.write( buf, 0, len );
                Log.d(TAG, "we are zipping "+ file.getName());
            }
            zos.closeEntry();
        }*/


        zos.closeEntry();
        zos.close();


    }
    /*
    * 生成kml的html备注,在description节点下
    * */
    public String getCdataContent(String id, String placeMarkName, String x, String y, String costValue)
    {
        StringBuffer buffer = new StringBuffer();
        buffer.append("<html xmlns:fo=\"http://www.w3.org/1999/XSL/Format\" xmlns:msxsl=\"urn:schemas-microsoft-com:xslt\">");
        buffer.append("<head>");
        buffer.append("<META http-equiv=\"Content-Type\" content=\"text/html\">");
        buffer.append("<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">");
        buffer.append("</head>");
        buffer.append("<body style=\"margin:0px 0px 0px 0px;overflow:auto;background:#FFFFFF;\">");
        buffer.append("<table style=\"font-family:Arial,Verdana,Times;font-size:12px;text-align:left;width:100%;border-collapse:collapse;padding:3px 3px 3px 3px\">");
        buffer.append("<tr style=\"text-align:center;font-weight:bold;background:#9CBCE2\">");
        buffer.append("<td>").append(placeMarkName).append("</td>");
        buffer.append("</tr>");
        buffer.append("<tr>");
        buffer.append("<td>");
        buffer.append("<table style=\"font-family:Arial,Verdana,Times;font-size:12px;text-align:left;width:100%;border-spacing:0px; padding:3px 3px 3px 3px\">");
        buffer.append("<tr bgcolor=\"#D4E4F3\">");
        buffer.append("<td>ID</td>");
        buffer.append("<td>").append(id).append("</td>");
        buffer.append("</tr>");
        buffer.append("<tr>");
        buffer.append("<td>name</td>");
        buffer.append("<td>").append(placeMarkName).append("</td>");
        buffer.append("</tr>");
        buffer.append("<tr bgcolor=\"#D4E4F3\">");
        buffer.append("<td>X</td>");
        buffer.append("<td>").append(x).append("</td>");
        buffer.append("</tr>");
        buffer.append("<tr>");
        buffer.append("<td>Y</td>");
        buffer.append("<td>").append(y).append("</td>");
        buffer.append("</tr>");
        buffer.append("<tr bgcolor=\"#D4E4F3\">");
        buffer.append("<td>CostValue</td>");
        buffer.append("<td>").append(costValue).append("</td>");
        buffer.append("</tr>");
        buffer.append("</table>");
        buffer.append("</td>");
        buffer.append("</tr>");
        buffer.append("</table>");
        buffer.append("</body>");
        buffer.append("</html>");

        String cDataContent = buffer.toString();
        return cDataContent;
    }

}

CoordinateAlterSample类如下

/*
 * 服务器返回的样点,每一个样点包括一个name,x,y,costValue
 * */
public class CoordinateAlterSample implements Serializable {
    private double x;
    private double y;
    private String name;
    private String costValue;

    public String getCostValue() {
        return costValue;
    }

    public void setCostValue(String costValue) {
        this.costValue = costValue;
    }

    public double getX() {
        return x;
    }
    public void setX(double x) {
        this.x = x;
    }
    public double getY() {
        return y;
    }
    public void setY(double y) {
        this.y = y;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用ArcGIS软件进行批量导出KML文件,可以通过以下步骤完成。 第一步,打开ArcMap。在ArcMap中,选择要导出KML的图层。可以是一个或多个图层。 第二步,使用"选择工具"或其他选择方法,选择要导出的要素。可以选择具体的要素、整个图层或整个数据集。 第三步,右击选中的图层,选择"数据"并在下拉菜单中选择"导出数据"。 第四步,弹"导出数据"对话框后,在"保存类型"中选择"Keyhole Markup Language (KML)"。 第五步,选择导出路径和文件名,然后点击"保存"按钮。 第六步,可以选择导出的选项,如导出为单一的KML文件或将每个要素导出为单独的KML文件等。 第七步,点击"确定"按钮开始导出导出的过程可能需要一些时间,具体取决于数据的大小和复杂性。 第八步,导出完成后,可以在导出路径查看生成的KML文件。 通过上述步骤,就可以使用ArcGIS软件进行批量导出KML文件。这样可以方便地将地理信息数据导出为适用于Google Earth等应用程序的KML格式,实现数据的可视化展示和共享。 ### 回答2: ArcGIS 是一款强大的地理信息系统软件,它提供了许多功能来处理、分析和展示地理数据。批量导出 KML 是其中一种常见的需求,可以用来在 Google Earth 等应用程序中显示和分享地理数据。 要批量导出 KML,首先需要准备好要导出的数据。在 ArcGIS 中,可以将数据存储在地理数据库中,或者在地理文件中,如 shapefile 或地理数据库。确保要导出的数据符合 KML 格式的要求。 接下来,在 ArcGIS 中,可以使用 "ArcToolbox" 功能来导出 KML。在 "Conversion Tools" 中,有一个 "From KML" 子菜单,里面包含多个工具可以使用。例如,"Features To KML" 工具可将矢量要素数据导出KML 文件。 在 "Features To KML" 对话框中,选择要导出的数据源和目标 KML 文件的位置。可以使用 "Batch" 功能来批量处理导出多个数据源。选择要导出的属性字段,调整其他导出选项,然后点击 "OK" 开始导出导出过程需要一些时间,取决于要导出的数据量和硬件性能。完成后,可以在指定的目标文件夹中找到导出KML 文件。 导出KML 文件可以通过 Google Earth 或其他 KML 支持的应用程序打开和查看。它将保留原始数据的空间属性和属性字段,并在地图上以图层的形式展示。用户可以通过控制该图层的可见性和样式来自定义地图显示。 总结来说,使用 ArcGIS 进行批量导出 KML 非常简便。通过合适的工具和选项,可以快速将地理数据转换为 KML 格式,并在各种地理应用程序中进行展示和分享。 ### 回答3: 在ArcGIS中批量导出KML文件可以通过以下步骤完成: 1. 打开ArcGIS软件并加载数据:首先,打开ArcMap或ArcGIS Pro,并加载需要导出KML的矢量或栅格数据。 2. 创建要素图层:如果您不想导出整个数据集,可以创建一个图层,只包含您希望导出的要素。使用选择工具或查询等方法,过滤掉不需要的要素。 3. 设定导出参数:右键单击要素图层,并选择“数据”选项卡中的“导出数据”或“导出功能”选项。在打开的对话框中,选择导出格式为“Keyhole Markup Language (KML)”并指定文件保存的位置。 4. 自定义导出设置(可选):在导出数据对话框中,您可以自定义导出KML文件的设置,比如名称、显示样式、标签等。您可以使用默认设置,或根据需要进行修改。 5. 启动批量导出:如果您需要批量导出多个要素图层或几何对象作为单独的KML文件,可以使用“批处理”工具。依次选择“Geoprocessing”>“执行工具”>“批处理”。在打开的对话框中,选择需要导出的图层和设置,然后运行批处理。 6. 检查导出结果:完成导出后,可以在指定的文件保存位置中找到生成的KML文件。使用Google Earth或其他支持KML格式的软件打开文件,检查导出结果是否符合预期。 请注意,上述步骤可能会因使用的ArcGIS版本而略有不同。根据您的具体版本,您可能需要在菜单选项或工具栏上查找相应的导出功能。此外,确保您有适当的许可证以执行导出操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值