如何使用Perl解析KML文件? [英] How to parse KML files using perl?
问题描述
我试图用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屋!