如何让最近的城市与Go进行地理坐标?

时间:2015-03-11 22:37:19

标签: go reverse-geocoding

如何从坐标(例如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(所以:只有城市)。

我如何才能获得这座城市?

3 个答案:

答案 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中实现。