如何通过 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
。它还必须包含一个<changeset>
元素。请参考API documentation for creating changesets。
添加元素是通过发送到/api/0.6/[node|way|relation]/create
来完成的,请参阅API documentation for creating elements。您必须在此处引用以前打开的变更集。
如果您仍然遇到问题,最好使用流行的 OSM 编辑器之一,并通过 wireshark 或类似程序查看他们的请求/响应。
【讨论】:
这里是 XML<?xml version="1.0" encoding="UTF-8"?> <osm version="0.6"> <node changeset="80115" version="4" id="4303111528" lat="48.619938" lon="7.727981">><tag k="opening_hours" v="Mo-Fr 07:45-12:00, 13:30-19:00; Sa 08:30-12:00, 13:30-18:30"/><tag k="shop" v="car_repair"/></node></osm>
以上是关于如何通过 OpenStreetMap PHP Api 更新节点的主要内容,如果未能解决你的问题,请参考以下文章
如何从openstreetmap.org下载特定区域中的所有道路和节点
我如何像冠状病毒一样设置 OpenStreetMap 的样式
如何在我的 mapview iOS 7 中使用 OpenLayer (OpenStreetMap) 瓦片