如何通过 OpenStreetMap PHP Api 更新节点

Posted

技术标签:

【中文标题】如何通过 OpenStreetMap PHP Api 更新节点【英文标题】:How to update a node via OpenStreetMap PHP Api 【发布时间】:2016-04-06 08:56:44 【问题描述】:

我正在尝试通过 OSM php API 更新我之前创建的节点。我开发了一些函数,通过使用开放的街道地图 API 进行一些 CRUD 操作。

我的更新函数正在获取节点和变更集 id 以进行此操作,然后我通过此 url /api/0.6/node/#id 发出 put 请求

    $ls_url_update_node = $this->get_api()->get_base_url() . "/api/0.6/node/".$this->get_id();
    $lo_requete = Request::put($ls_url_update_node);

    $ls_xml_node = $this->generate_xml($po_changeset);

    $lo_requete = Request::put($ls_url_update_node)
        ->sendsType('text/xml')
        ->addHeader('Authorization', $this->get_api()->get_authorization_header())
        ->body($ls_xml_node);
    $lo_response = $lo_requete->send();

genarate_xml 函数尝试生成符合 OSM 规范的有效 XML。

<osm>
 <node id="123" lat="..." lon="..." version="142" changeset="12"   user="fred" uid="123" visible="true" timestamp="2005-07-30T14:27:12+01:00">
  <tag k="note" v="Just a node"/>
   ...
 </node>
</osm>

OSM Api 返回此错误消息:无法从 xml 字符串解析有效节点。 Mayeb 我已经跳过了节点的创建和更新之间的一些差异。所以请大家帮忙。

【问题讨论】:

请向我们展示您尝试发送的 XML 文件的完整示例。 【参考方案1】:

您必须将您的请求发送至/api/0.6/changeset/create。它还必须包含一个&lt;changeset&gt; 元素。请参考API documentation for creating changesets。

添加元素是通过发送到/api/0.6/[node|way|relation]/create 来完成的,请参阅API documentation for creating elements。您必须在此处引用以前打开的变更集。

如果您仍然遇到问题,最好使用流行的 OSM 编辑器之一,并通过 wireshark 或类似程序查看他们的请求/响应。

【讨论】:

这里是 XML &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;osm version="0.6"&gt; &lt;node changeset="80115" version="4" id="4303111528" lat="48.619938" lon="7.727981"&gt;&gt;&lt;tag k="opening_hours" v="Mo-Fr 07:45-12:00, 13:30-19:00; Sa 08:30-12:00, 13:30-18:30"/&gt;&lt;tag k="shop" v="car_repair"/&gt;&lt;/node&gt;&lt;/osm&gt;

以上是关于如何通过 OpenStreetMap PHP Api 更新节点的主要内容,如果未能解决你的问题,请参考以下文章

如何从openstreetmap.org下载特定区域中的所有道路和节点

我如何像冠状病毒一样设置 OpenStreetMap 的样式

如何在颤动中使用传单“openstreetmap”?

如何在我的 mapview iOS 7 中使用 OpenLayer (OpenStreetMap) 瓦片

如何以索引方式有效地存储所有 OpenStreetMap 数据?

如何从 OpenStreetMap 数据中找到街道交叉口的列表?