加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

使用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属性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读