gpt4 book ai didi

php - 使用 Php 从 .osm XML 文件中提取数据

转载 作者:可可西里 更新时间:2023-10-31 23:39:37 26 4
gpt4 key购买 nike

我试图从 .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 值。

像这样:

表格引用

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属性。

关于php - 使用 Php 从 .osm XML 文件中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30316371/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com