如何从坐标(例如49.014,8.4043)获取地理位置(例如最近的城市)和Go?
我尝试使用golang-geo:
package main
import (
"log"
"github.com/kellydunn/golang-geo"
)
func main() {
p := geo.NewPoint(49.014, 8.4043)
geocoder := new(geo.GoogleGeocoder)
geo.HandleWithSQL()
res, err := geocoder.ReverseGeocode(p)
if err != nil {
log.Println(err)
}
log.Println(string(res))
}
但它给出了Schloßplatz 23, 76131 Karlsruhe, Germany
。我想要
Karlsruhe
(所以:只有城市)。
我如何才能获得这座城市?
答案 0 :(得分:4)
您要提取的数据不会直接从库中返回。但是,您可以执行请求并自行解析JSON响应以提取城市,而不是完整地址:
package main
import (
"encoding/json"
"fmt"
"log"
"github.com/kellydunn/golang-geo"
)
type googleGeocodeResponse struct {
Results []struct {
AddressComponents []struct {
LongName string `json:"long_name"`
Types []string `json:"types"`
} `json:"address_components"`
}
}
func main() {
p := geo.NewPoint(49.014, 8.4043)
geocoder := new(geo.GoogleGeocoder)
geo.HandleWithSQL()
data, err := geocoder.Request(fmt.Sprintf("latlng=%f,%f", p.Lat(), p.Lng()))
if err != nil {
log.Println(err)
}
var res googleGeocodeResponse
if err := json.Unmarshal(data, &res); err != nil {
log.Println(err)
}
var city string
if len(res.Results) > 0 {
r := res.Results[0]
outer:
for _, comp := range r.AddressComponents {
// See https://developers.google.com/maps/documentation/geocoding/#Types
// for address types
for _, compType := range comp.Types {
if compType == "locality" {
city = comp.LongName
break outer
}
}
}
}
fmt.Printf("City: %s\n", city)
}
答案 1 :(得分:2)
the Geocoder
interface from that library的文档说(强调我的):
...反向地理编码应接受指向Point的指针,并返回最接近它的街道地址。
因此,您必须从街道地址(这是它自己的挑战)解析城市名称,或者找到明确提供城市的不同地理编码器库。
答案 2 :(得分:1)
此处golang-geo
的作者。
对于那些跟随此堆栈溢出问题的人,我已回答@moose在问题#31 here中的主要问题。
这个问题的答案是,尽管Google地理编码API确实支持some fuzzy notion获得不同级别的精度,但迄今为止尚未在golang-geo中实现。