我有一个带有城市名称的 json 结果集,我想为每个结果获取纬度。 以下函数在一定程度上起作用:
(:require [http.async.client :as client])
(defn get-geo-fact [row]
(let [
n (string/replace (:cityname row) " " "+")
url (str "http://maps.googleapis.com/maps/api/geocode/json?address="
n "&sensor=false")
resp (client/GET url) ]
(client/await resp)
(make-geo-fact row (json/read-json (client/string resp))) ))
对make-geo-fact的最后一次调用只返回城市坐标的RDF渲染。 我遇到的问题是运行(大约 40 次调用此函数)会返回一些(3-5 个经度对)纬度的空结果。 返回 null 值的城市因运行而异 - 有时圣何塞会获取坐标,有时不会。
我最初使用 slurp 来抓取 url 的正文,并得到了类似的偶尔空值。 我想我没有正确等待响应,但切换到 http.async.client 似乎并没有起到作用。 有什么想法吗?
编辑:
下面是make-geo-fact函数,它采用"这个团队位于这个城市"的事实和谷歌地图的响应,返回两个三元组的向量,传达纬度和经度:
(defn make-geo-fact [row response]
(let [ g (:location (:geometry (first (:results response))))
lat (str "<" (:team row) ">"
" <http://www.nhl.com/latitude> "" (:lat g)
""^^<http://www.w3.org/2001/XMLSchema#decimal> ." )
lon (str "<" (:team row) ">"
" <http://www.nhl.com/longitude> "" (:lng g)
""^^<http://www.w3.org/2001/XMLSchema#decimal> ." ) ]
[lat lon] ))
这是我调用的启动整个事情的功能:
(defn make-geo-facts []
(let [ a (bounce team-city (build "files/team-city.nt"))
f "files/geo-facts.nt" ]
(spit f (string/join "n" (flatten (map get-geo-fact (:rows a)))))
f ))
其中,反弹函数针对RDF模型发出SPARQL选择查询,该查询使用构建函数实例化。
编辑 2
下面是一个不需要制作地理事实的重新因素:
(defn get-geo-fact [row]
(let [ n (string/replace (:cityname row) " " "+")
url (str "http://maps.googleapis.com/maps/api/geocode/json?address=" n "&sensor=false")
resp (client/GET url) ]
(-> (client/GET url)
client/await
client/string
json/read-json
:results
first
:geometry
:location )))
(defn make-geo-facts []
(let [ a (bounce tc-query (build "files/team-city.nt"))
f "files/geo-facts.nt"
*client* (client/create-client)]
(try (spit f (string/join "n" (flatten (map get-geo-fact (:rows a))))))
(finally (client/close *client*)) ))
正如您所说,更改客户端实现并没有产生任何影响。我仔细检查并为http.async.client的开发版本创建了一个测试。并且总是得到身体的回应。
请提供虚构的地理事实实施。
事实证明,我的代码需要一点睡眠。 我在我的核心函数中添加了(线程/睡眠 1000),现在我没有得到空结果:
(defn get-geo-fact [row]
(let [ n (string/replace (:cityname row) " " "+")
url (str "http://maps.googleapis.com/maps/api/geocode/json?address=" n "&sensor=false")
resp (client/GET url) ]
(Thread/sleep 1000)
(-> (client/GET url)
client/await
client/string
json/read-json
(make-geo-fact ,,, row ) )))