我在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事实的最后一次调用只返回城市坐标的RDF呈现。我遇到的问题是,一个运行(对这个函数的调用大约有40个)返回几个(3-5个lat-长对)空结果。返回空值的城市因运行不同而不同--有时圣何塞获得坐标,有时却没有。
我最初使用slurp来抓取url的身体,并得到了类似的-偶尔的零。我想我不是在等待正确的响应,但是切换到http.async.client似乎并不能奏效。有什么想法吗?
编辑
下面是做地理事实的函数,它接受了一个“这个团队位于这个城市”的事实和谷歌地图的回应,返回了一个表示纬度和经度的两个三元组的向量:
(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 select查询,使用build函数实例化该模型。
编辑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*)) ))发布于 2011-05-25 15:44:50
结果我的代码需要一点睡眠。我在我的核心函数中添加了(线程/睡眠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 ) )))发布于 2011-05-13 22:02:00
正如您已经说过的,更改客户端实现没有什么不同。我为http.async.client的开发版本进行了双重检查并创建了一个http.async.client。总是有身体反应。
请提供实际执行情况.
https://stackoverflow.com/questions/5994502
复制相似问题