У меня есть набор результатов в 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 пар длинного лат) нулевых результатов для длинных длин.Города, которые возвращают нулевые значения, отличаются от запуска к пробегу - иногда Сан-Хосе получает координаты, а иногда нет.
Первоначально я использовал slurp , чтобы захватить тело URL-адреса и получил аналогичные случайные нули.Я подумал, что не дождался ответа должным образом, но переключение на http.async.client , похоже, не сработало.Есть идеи?
edit :
Вот функция make-geo-fact, которая принимает факт "эта команда находится в этом городе" и ответ от Googleкарты, возвращая вектор из двух троек, которые передают широту и долготу:
(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 ))
Где bounce Функция выдает запрос выбора SPARQL для модели RDF, для которой создается функция build .
edit 2
Вот рефакторинг, где make-geo-fact не нужен:
(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*)) ))