使用Php从.osm XML文件中提取数据
发布时间:2020-12-13 15:55:58 所属栏目:PHP教程 来源:网络整理
导读:我试图从.Osm文件中提取一些数据. 所以我有这样的事情: way id="28747493" visible="true" version="7" changeset="9347177" timestamp="2011-09-19T21:48:11Z" user="Camilo Alvarez" uid="492132" nd ref="316077528"/ nd ref="316077503"/ tag k="highwa
我试图从.Osm文件中提取一些数据.
所以我有这样的事情: <way id="28747493" visible="true" version="7" changeset="9347177" timestamp="2011-09-19T21:48:11Z" user="Camilo Alvarez" uid="492132"> <nd ref="316077528"/> <nd ref="316077503"/> <tag k="highway" v="primary"/> <tag k="lanes" v="1"/> <tag k="name" v="Calle 51"/> <tag k="oneway" v="yes"/> <tag k="ref" v="Boyacá"/> </way> <way id="28747492" visible="true" version="9" changeset="7227086" timestamp="2011-02-08T15:33:22Z" user="dmartinh" uid="314700"> <nd ref="358031212"/> <nd ref="316077505"/> <tag k="foot" v="permissive"/> <tag k="highway" v="footway"/> <tag k="name" v="Calle 52"/> </way> 因此,我想提取每个单独的“ref”并放入一个名为“referencia的表中,我想将标签名称”calle 51“分配给该ref值. 像这样的东西: 表referencia idnode -------- via 316077528 | Calle 51 | 316077503 | Calle 51 | 358031212 | Calle 52 | 316077505 | Calle 52 | ---------------------- 所以,我可以很好地存储“idnode”值,但我不能存储“via”值.我试图在没有成功的情况下制造某种形式的foreach. 当然我不知道为什么我们有一个迭代得到“idnode”值和“via”为什么不可能存储在一起. <?php < ? global $referencia; global $via; /* /** * OSM Overpass API with PHP SimpleXML / XPath * * PHP Version: 5.4 - Can be back-ported to 5.3 by using 5.3 Array-Syntax (not PHP 5.4's square brackets) */ $dbhost = 'localhost'; $dbuser = 'root'; $dbpass = ''; $conn = mysql_connect($dbhost,$dbuser,$dbpass); mysql_select_db('map'); if (!$conn) { die('Could not connect: ' . mysql_error()); } echo 'Connected successfully'; $xml = simplexml_load_file("map.osm"); $counter = - 1; foreach($xml->children() AS $child) { $counter++; if ($child->getName() == 'way') { // if($child->getName() == 'node'){ // echo $counter; $name = ""; $id = ""; $lat = ""; $lon = ""; $name = $child['version']; $id = $child['id']; $lat = $child['lat']; $lon = $child['lon']; } foreach($child->children() AS $grandchild) { if ($grandchild->getname() == 'nd') { $referencia = $grandchild['ref']; if ($grandchild->getName() == 'tag') { if ($grandchild['k'] == 'name') { $via = $grandchild['v']; } } mysql_query("INSERT INTO referencia (idnode,via) VALUES ('$referencia','$via')"); } } } ?> 提前致谢. 解决方法
您可以使用
SimpleXMLElement::xpath来获取“via”和相应的“idnode”值.例如 :
$raw = <<<EOF <root> <way id="28747493" visible="true" version="7" changeset="9347177" timestamp="2011-09-19T21:48:11Z" user="Camilo Alvarez" uid="492132"> <nd ref="316077528"/> <nd ref="316077503"/> <tag k="highway" v="primary"/> <tag k="lanes" v="1"/> <tag k="name" v="Calle 51"/> <tag k="oneway" v="yes"/> <tag k="ref" v="Boyacá"/> </way> <way id="28747492" visible="true" version="9" changeset="7227086" timestamp="2011-02-08T15:33:22Z" user="dmartinh" uid="314700"> <nd ref="358031212"/> <nd ref="316077505"/> <tag k="foot" v="permissive"/> <tag k="highway" v="footway"/> <tag k="name" v="Calle 52"/> </way> </root> EOF; $xml = simplexml_load_string($raw); foreach($xml->xpath("//way") AS $way){ $via = $way->xpath("tag[@k='name']/@v")[0]; foreach($way->nd AS $nd){ $idnode = $nd["ref"]; echo $idnode .",". $via ."<br>"; } } Demo 输出: 316077528,Calle 51 316077503,Calle 51 358031212,Calle 52 316077505,Calle 52 xpath解释: > // way选择所有< way> XML文档中任何位置的元素.> tag [@ k =’name’]选择< tag>当前上下文节点的子节点,其k属性值等于name.然后从< tag>,/ @ v返回v属性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |