美文网首页iOS开发.
兼容两步路的KML文件

兼容两步路的KML文件

作者: 侭情显現 | 来源:发表于2019-04-23 13:56 被阅读4次

公司轨迹使用正规的KML文件格式.用谷歌的api-KML.http://code.google.com/apis/kml/documentation/kmlreference.html进行解析

现需要兼容两步路的KML轨迹文件.使用以上api会解析失败.发现两步路使用的不是标准的KML文件.所以针对谷歌api_KML的源码做调整如下即可:

KMLAbstractFeature.m文件中

   - (id)initWithXMLElement:(KMLXMLElement *)element parent:(KMLElement *)parent
    {
        self = [super initWithXMLElement:element parent:parent];
        if (self) {
            ......
            //解析gx:coord样式
            NSMutableArray * fq_gxCoordArr = [NSMutableArray array];
            KMLXMLElement *el = [KMLXML childAndNextElementNamed:@"gx:coord" parentElement:element];
            while (el != nil) {
                KMLCoordinate * coordinate = [[KMLCoordinate alloc]initWithCustomText:[KMLXML textForElement:el]];
                [fq_gxCoordArr addObject:coordinate];
                el = [KMLXML nextSiblingNamed:@"gx:coord" searchFromElement:el];
            }
            _gxCoordArr = fq_gxCoordArr;
            
            _point = (KMLPoint *)[self childElementOfClass:[KMLPoint class] xmlElement:element];
        }
        return self;
    }

KMLXML.m文件中添加一种全新解析方法

 + (KMLXMLElement*) childAndNextElementNamed:(NSString*)aName  parentElement:(KMLXMLElement*)aParentXMLElement{
        KMLXMLElement * xmlElement = aParentXMLElement;
        const char * name = [aName cStringUsingEncoding:NSUTF8StringEncoding];
        while (xmlElement) {
            xmlElement = xmlElement->firstChild;
            if(xmlElement){
                
                if (strlen(xmlElement->name) == strlen(name) && memcmp(xmlElement->name,name,strlen(name)) == 0) {
                    return xmlElement;
                }
                xmlElement = xmlElement->nextSibling;
                if (strlen(xmlElement->name) == strlen(name) && memcmp(xmlElement->name,name,strlen(name)) == 0) {
                    return xmlElement;
                }
            }
        }
        return nil;
    }

随后在解析出轨迹的类:KKTraceFileServers.m中添加自己的代码

  + (void)asyncChangeToLineModelWithKMLRoot:(KMLRoot *)kmlRoot
                       complitedBlock:(void(^)(NSArray<KKMapLineModel *> *lineModels))complitedBlock
{
                          .......

                      KMLLineString *line = (KMLLineString *)placemark.geometry;
                        
                        if (!line) {
                            if (placemark.gxCoordArr.count > 0) {
                                line = [[KMLLineString alloc]init];
                                [line setValue:placemark.gxCoordArr forKey:@"_coordinates"];
                            }
                        }
                        
                        if (![line isKindOfClass:[KMLLineString class]]) {
                            if (complitedBlock)
                            {
                                complitedBlock(nil);
                            }                                
                            continue;
                        }
                    ..........
  }

如此即可成功解析出轨迹点.思路来源于观察两步路的数据格式样式!

相关文章

  • 兼容两步路的KML文件

    公司轨迹使用正规的KML文件格式.用谷歌的api-KML.http://code.google.com/apis/...

  • KML文件解析显示在地图

    KML文件格式1: KML文件格式2: 解析代码 }

  • ArcGIS处理kml文件

    1、添加kml文件 点击+号添加kml文件,将要处理的kml文件导入 2、导出shape文件 导入后如图所示,左侧...

  • KML

    一个典型的kml文件: kml2.0介绍 kml全称是keyhole markup language。kml是一个...

  • rinex2kml(rinex生成kml****文件****)

    rinex2kml(rinex生成kml****文件****) 使用说明手册 rinex文件作为GNSS数据存储、...

  • PHP解析15w行kml文件

    要解析kml文件,首先是必须要知道kml是什么,其次还要了解kml的语法,然后才能谈得上解析它,这些都会了之后,假...

  • Kml导出教程

    概述:基于PostGis生成Kml坐标文本,自定义样式 Kml文件结构说明 其中文档主体结构可拆分为 Docume...

  • GDataXMLNode解析xml文件

    GitHub地址 pod 'GDataXML-HTML' 解析kml 读取文件并解析成GDataXMLDocume...

  • openlayers 加载KML文件

    在设置style样式时,发现不起作用,需要设置一个属性 extractStyles: false import V...

  • GMT绘制kml文件--gmt2kml

    使用: gmt2kml [ table ] [ -Aa|g|s[alt|xscale] ] [ -Ccpt ] [...

网友评论

    本文标题:兼容两步路的KML文件

    本文链接:https://www.haomeiwen.com/subject/nvrvgqtx.html