如何使用Perl解析KML文件? [英] How to parse KML files using perl?

查看:86
本文介绍了如何使用Perl解析KML文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图用perl解析一个KML文件。我正在尝试使用 XML :: Simple 模块来完成此操作。



我想通过每个地标和提取一些数据即
$ b $ 1 1)Mcode -
2)坐标

帖子,我尝试了下面的方法来打印所有点的坐标,但是它失败了

  use strict; 
使用警告;
使用XML :: Simple;
使用Data :: Dumper;

my $ myFile = XMLin('ExperimentMap.kml');

foreach my $文件夹(@ {$ myFile-> {文档} - > {文件夹} - > {地标}}){
print $ folder-> {Point } - GT; {坐标} \\\

}

我使用以下KML:

 <?xml version ='1.0'encoding ='UTF-8'?> 
< kml xmlns ='http://www.opengis.net/kml/2.2'>
<文件>
< name> ExperimentMap< / name>
< description><![CDATA []]>< / description>
<文件夹>
< name> ExperimentLayer< / name>
<地标>
< styleUrl>#图标-503-FF8277< / styleUrl>
<名称>主页< /名称>
< ExtendedData>
< Data name ='string'>
< displayName> Mcode< / displayName>
<值> PLAAB< /值>
< / Data>
< / ExtendedData>
< ExtendedData>
< Data name ='string'>
< displayName>邮政编码< / displayName>
<值> 450010< /值>
< / Data>
< / ExtendedData>
< description><![CDATA [my home


Mcode:PLAAB
postal code:450010]]>< / description>
< Point>
<坐标> 80.23435592651367,13.094024942328286,0.0< / coordinates>
< / Point>
< /地标>
<地标>
< styleUrl>#图标-503-FF8277< / styleUrl>
<名称>商店< /名称>
< ExtendedData>
< Data name ='string'>
< displayName> Mcode< / displayName>
<值> XMPLE< /值>
< / Data>
< / ExtendedData>
< ExtendedData>
< Data name ='string'>
< displayName>邮政编码< / displayName>
<值> 450013< /值>
< / Data>
< / ExtendedData>
< description><![CDATA [my shop


Mcode:XMPLE
postal code:450013]]>< / description>
< Point>
<坐标> 80.2437973022461,13.106230102044576,0.0< / coordinates>
< / Point>
< /地标>
<地标>
< styleUrl>#图标-503-FF8277< / styleUrl>
< name> place3< / name>
< ExtendedData>
< Data name ='string'>
< displayName> Mcode< / displayName>
<值> UDKBL< /值>
< / Data>
< / ExtendedData>
< ExtendedData>
< Data name ='string'>
< displayName>邮政编码< / displayName>
<值> 578635< /值>
< / Data>
< / ExtendedData>
< description><![CDATA [my school


Mcode:UDKBL
postal code:578635]]>< / description>
< Point>
<坐标> 80.24688720703125,13.096198508196448,0.0< / coordinates>
< / Point>
< /地标>
< / Folder>
< Style id ='icon-503-FF8277'>
< IconStyle>
< color> ff7782FF< / color>
< scale> 1.1< / scale>
<图标>
< href> http://www.gstatic.com/mapspro/images/stock/503-wht-blank_maps.png< / href>
< /图标>
< / IconStyle>
< / style>
< / Document>
< / kml>


解决方案

如何



  while(my($ key,$ folder)= each%{$ myFile-> {Document} {Folder} {Placemark}}){
print $ folder-> {Point} - > {coordinates}。\\\
;
}

输出:

  80.2437973022461,13.106230102044576,0.0 
80.24688720703125,13.096198508196448,0.0
80.23435592651367,13.094024942328286,0.0

在您的代码中,您正在使用

  foreach my $ folder(@ {$ myFile-> {Document}  - > {Folder}  - > {Placemark}}){
print $ folder-> {Point} - > {coordinates} \\\
;
}

假设 $ myFile-> {文档} - > {文件夹} - > {地标} 是对数组的引用。但它不是,它是一个散列的引用,所以你必须通过它,并foreach对(键,值)从该值提取坐标。


I am trying to parse a KML file using perl. I am trying to use XML::Simple module for doing this.

I want to go through each placemarker and extract some data namely

1) Mcode
2) coordinates

After reading several posts, I tried the following just to print the coordinates of all the points, but it fails

use strict;
use warnings;
use XML::Simple;
use Data::Dumper;

my $myFile = XMLin('ExperimentMap.kml');

foreach my $folder (@{$myFile->{Document}->{Folder}->{Placemark}})  {
    print $folder->{Point}->{coordinates}."\n";
}

I am using the following KML:

<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://www.opengis.net/kml/2.2'>
    <Document>
        <name>ExperimentMap</name>
        <description><![CDATA[]]></description>
        <Folder>
            <name>ExperimentLayer</name>
            <Placemark>
                <styleUrl>#icon-503-FF8277</styleUrl>
                <name>home</name>
                <ExtendedData>
                    <Data name='string'>
                        <displayName>Mcode</displayName>
                        <value>PLAAB</value>
                    </Data>
                </ExtendedData>
                <ExtendedData>
                    <Data name='string'>
                        <displayName>postal code</displayName>
                        <value>450010</value>
                    </Data>
                </ExtendedData>
                <description><![CDATA[my home


Mcode: PLAAB
postal code: 450010]]></description>
                <Point>
                    <coordinates>80.23435592651367,13.094024942328286,0.0</coordinates>
                </Point>
            </Placemark>
            <Placemark>
                <styleUrl>#icon-503-FF8277</styleUrl>
                <name>shop</name>
                <ExtendedData>
                    <Data name='string'>
                        <displayName>Mcode</displayName>
                        <value>XMPLE</value>
                    </Data>
                </ExtendedData>
                <ExtendedData>
                    <Data name='string'>
                        <displayName>postal code</displayName>
                        <value>450013</value>
                    </Data>
                </ExtendedData>
                <description><![CDATA[my shop


Mcode: XMPLE
postal code: 450013]]></description>
                <Point>
                    <coordinates>80.2437973022461,13.106230102044576,0.0</coordinates>
                </Point>
            </Placemark>
            <Placemark>
                <styleUrl>#icon-503-FF8277</styleUrl>
                <name>place3</name>
                <ExtendedData>
                    <Data name='string'>
                        <displayName>Mcode</displayName>
                        <value>UDKBL</value>
                    </Data>
                </ExtendedData>
                <ExtendedData>
                    <Data name='string'>
                        <displayName>postal code</displayName>
                        <value>578635</value>
                    </Data>
                </ExtendedData>
                <description><![CDATA[my school


Mcode: UDKBL
postal code: 578635]]></description>
                <Point>
                    <coordinates>80.24688720703125,13.096198508196448,0.0</coordinates>
                </Point>
            </Placemark>
        </Folder>
        <Style id='icon-503-FF8277'>
            <IconStyle>
                <color>ff7782FF</color>
                <scale>1.1</scale>
                <Icon>
                    <href>http://www.gstatic.com/mapspro/images/stock/503-wht-blank_maps.png</href>
                </Icon>
            </IconStyle>
        </Style>
    </Document>
</kml>

解决方案

How about:

while (my ($key, $folder) = each %{$myFile->{Document}{Folder}{Placemark}})  {
    print $folder->{Point}->{coordinates}."\n";
}

output:

80.2437973022461,13.106230102044576,0.0
80.24688720703125,13.096198508196448,0.0
80.23435592651367,13.094024942328286,0.0

In your code, you're using

foreach my $folder (@{$myFile->{Document}->{Folder}->{Placemark}})  {
    print $folder->{Point}->{coordinates}."\n";
}

assuming $myFile->{Document}->{Folder}->{Placemark} is a reference to an array. But it isn't, it is a reference to a hash, so you have to walk thru it and foreach pair of (key,value) extract the coordinate from the value.

这篇关于如何使用Perl解析KML文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆