最近在接触地图数据转换的东西,从硬件kml的数据转换其他的格式,因为从没做过着东西, 先去了解kml文件格式

http://baike.baidu.com/view/400307.htm?fr=aladdin

   原来是谷歌地球的一种数据格式,先大致看了写里面的标签,kml与xml文件差多,

     kml数据:

        KML,SHP TAB互转,GDAL

        longitude:经度  latitude:纬度   altitude:高度 其他的就自己去看了。

        现在开始转换,在谷歌上找到一个开源的项目 里面是对地图数据的操作,GDAL

 http://www.gdal.org/ogr/ogr_formats.html 参考这里。

   kml->SHP

 private string CreateShp(List<Placemark> list)
        {

            //注册Ogr库
            string pszDriverName = DriverType.Shapefile;
            OSGeo.OGR.Ogr.RegisterAll();

            //为了支持中文路径,请添加下面这句代码
            OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
            // 为了支持shp属性表字段支持中文,请添加下面这句
            OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", " ");

            //调用对Shape文件读写的Driver接口
            OSGeo.OGR.Driver poDriver = OSGeo.OGR.Ogr.GetDriverByName(pszDriverName);
            if (poDriver == null)
                return "打开驱动失败";

            //用此Driver创建Shape文件
            OSGeo.OGR.DataSource poDS;
            poDS = poDriver.CreateDataSource(CreateSavePath(), null);
            if (poDS == null)
                return "创建数据源失败";

            //创建层Layer
            OSGeo.OGR.Layer poLayer;
            poLayer = poDS.CreateLayer(CurrentDate, null, OSGeo.OGR.wkbGeometryType.wkbPoint, null);
            if (poLayer == null)
                return "创建地图层失败";

            //创建属性
            OSGeo.OGR.FieldDefn oField = new OSGeo.OGR.FieldDefn("name", OSGeo.OGR.FieldType.OFTString);
            oField.SetWidth(16);
            OSGeo.OGR.FieldDefn oField2 = new OSGeo.OGR.FieldDefn("height", OSGeo.OGR.FieldType.OFTInteger);

            OSGeo.OGR.FieldDefn ofield3 = new FieldDefn("lat", FieldType.OFTInteger);
            OSGeo.OGR.FieldDefn ofield4 = new FieldDefn("lng", FieldType.OFTInteger);


            poLayer.CreateField(oField, 1);
            poLayer.CreateField(oField2, 0);
            poLayer.CreateField(ofield3, 2);
            poLayer.CreateField(ofield4, 3);

            //创建一个Feature,一个Point
            OSGeo.OGR.Feature poFeature = new Feature(poLayer.GetLayerDefn());
            OSGeo.OGR.Geometry pt = new Geometry(OSGeo.OGR.wkbGeometryType.wkbPoint);


            foreach (Placemark item in list)
            {
                //属性一"名称"赋值
                poFeature.SetField(0, item.Name);
                //属性二"高度"赋值
                poFeature.SetField(1, item.LookAt.altitude);
                poFeature.SetField(2, item.LookAt.latitude);
                poFeature.SetField(3, item.LookAt.longitude);

                //添加坐标点 x  y z
                pt.AddPoint(item.LookAt.longitude, item.LookAt.latitude, item.LookAt.altitude);

                poFeature.SetGeometry(pt);
                //将带有坐标及属性的Feature要素点写入Layer中
                poLayer.CreateFeature(poFeature);


                
            }

       
            //关闭文件读写
            poFeature.Dispose();
            poDS.Dispose();

            return "转换成功";
        }
View Code

相关文章: