iOS开发.

兼容两步路的KML文件

2019-04-23  本文已影响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;
                        }
                    ..........
  }

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

上一篇 下一篇

猜你喜欢

热点阅读