如何使用go语言从google map api获取经度和纬度?

时间:2018-06-09 12:40:49

标签: json go struct get unmarshalling

如何使用go从位置中获取' lat' ' lng' 语言?

我试图获取经度和经度,以便将其用于下一个api以获取特定位置的天气。

运行代码时出错:

  

恐慌:运行时错误:索引超出范围

我的回答如下: https://developers.google.com/maps/documentation/geocoding/start

我的代码在这里。

package main

import (
    "os"
    "fmt"
    "net/http"
    "log"
    "encoding/json"
    "io/ioutil"
)

const helloMessage = "Hello to the weather program. Please enter the name of the city and the weather will show."
const googleApiUri = "https://maps.googleapis.com/maps/api/geocode/json?key=MYKEY&address="



type googleApiResponse struct {
    Results Results `json:"results"`
}

type Results []Geometry

type Geometry struct {
    Geometry Location `json:"geometry"`
}

type Location struct {
    Location Coordinates `json:"location"`
}

type Coordinates struct {
    Latitude string `json:"lat"`
    Longitude string `json:"lng"`
}


func main() {
    fmt.Println(helloMessage)

    args := os.Args
    getCityCoordinates(args[0])
}

func getCityCoordinates(city string) {
    fmt.Println("Fetching langitude and longitude of the city ...")
    resp, err := http.Get(googleApiUri + city)

    if err != nil {
        log.Fatal("Fetching google api uri data error: ", err)
    }

    bytes, err := ioutil.ReadAll(resp.Body)
    defer resp.Body.Close()
    if err != nil {
        log.Fatal("Reading google api data error: ", err)
    }

    var data googleApiResponse
    json.Unmarshal(bytes, &data)
    fmt.Println(data.Results[0].Geometry.Location.Latitude)

    fmt.Println("Fetching langitude and longitude ended successful ...")
}

enter image description here

2 个答案:

答案 0 :(得分:1)

直接致电google-maps-services-go

var clinetGCM *maps.Client
    if clinetGCM == nil {
    // Pre-declare an err variable to avoid shadowing client.
    var err error

    clinetGCM, err = maps.NewClient(maps.WithAPIKey("api-key"))
    if err != nil {
        log.Fatalf("maps.NewClient failed: %v", err)
    }
}

//CM is a google cloud maps
type CM struct {
  Client *maps.Client
}

// Location is a gps
type Location struct {
  Lat float64 `json:"lat"`
  Lng float64 `json:"lng"`
}

// GeocodeAdress provided Location data from gcp maps geocoder api
func (cm *CM) GeocodeAdress(address string) (Location, error) {

  var loc Location

  r := &maps.GeocodingRequest{
      Address: address,
  }

  res, err := cm.Client.Geocode(context.Background(), r)
  if err != nil || len(res) == 0 {
      return loc, fmt.Errorf("res Geocode err: %v", err)
  }

  loc.Lat = res[0].Geometry.Location.Lat
  loc.Lng = res[0].Geometry.Location.Lng

  return loc, nil
}

答案 1 :(得分:0)

尝试使用float64来统计纬度和经度。因为它们不是字符串。因此在解组时显示错误。将Coordinates结构更改为

type Coordinates struct {
    Latitude  float64 `json:"lat"`
    Longitude float64 `json:"lng"`
}

检查Go Playground

上的工作代码

有关Umarshal的更多信息以及可以使用的类型。通过Golang Spec获取JSON unmarshal

如果您不了解结构的格式,也可以使用interface{}

  

要将JSON解组为接口值,Unmarshal存储其中一个   这些在界面值中:

bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null