如何使用 Go 获得最近的城市地理坐标?
How can I get the nearest city to geo-coordinates with Go?
如何使用 Go 从坐标(例如 49.014,8.4043)获取地理位置(例如最近的城市)?
我尝试使用 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
(所以:只有城市)。
如何只获取城市?
the Geocoder
interface from that library 的文档说(强调我的):
... Reverse geocoding should accept a pointer to a Point, and return the street address that most closely represents it.
因此,您必须要么从街道地址解析城市名称(这本身就是一个挑战),要么找到一个明确提供城市的不同地理编码器库。
您要提取的数据不是直接从图书馆返回的。但是,您可以执行请求并自己解析 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)
}
golang-geo
的作者在这里。
对于那些跟随这个堆栈溢出问题的人,我已经回答了@moose 在第 31 期中的主要问题 here。
这个问题的 tl;dr 答案是,虽然 Google 地理编码 API 确实支持 some fuzzy notion 获得不同级别的精度,但迄今为止它尚未在 golang-geo 中实现.
如何使用 Go 从坐标(例如 49.014,8.4043)获取地理位置(例如最近的城市)?
我尝试使用 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
(所以:只有城市)。
如何只获取城市?
the Geocoder
interface from that library 的文档说(强调我的):
... Reverse geocoding should accept a pointer to a Point, and return the street address that most closely represents it.
因此,您必须要么从街道地址解析城市名称(这本身就是一个挑战),要么找到一个明确提供城市的不同地理编码器库。
您要提取的数据不是直接从图书馆返回的。但是,您可以执行请求并自己解析 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)
}
golang-geo
的作者在这里。
对于那些跟随这个堆栈溢出问题的人,我已经回答了@moose 在第 31 期中的主要问题 here。
这个问题的 tl;dr 答案是,虽然 Google 地理编码 API 确实支持 some fuzzy notion 获得不同级别的精度,但迄今为止它尚未在 golang-geo 中实现.