【问题标题】:Get Latitude and Longitude from Google Places Autocomplete in React Native在 React Native 中从 Google Places Autocomplete 获取纬度和经度
【发布时间】:2019-09-12 02:34:34
【问题描述】:

我已为我的地址字段实现了自动完成功能,但从 Google 地图地点自动完成功能返回的 json 不包括这些地点的地理编码坐标。

那里有一些似乎不合适的答案。例如,this one 指的是 google.maps.places.Autocomplete(input, options); 之类的东西,我认为这在 React Native 中不是一个东西。

其他答案似乎基于react-native-google-places-autocomplete,但我自己实现了这个,我不想再使用那个模块。

这是我调用 API 的方法。

  async handleAddressChange() {
    const url = `https://maps.googleapis.com/maps/api/place/autocomplete/json?key=${GoogleAPIKey}&input=${this.state.address}`;
    try {
      const result = await fetch(url);
      const json = await result.json();
      this.setState({ addressPredictions: json.predictions });
    } catch (err) {
      console.error(err);
    }
  }

  setAddress(prediction) { 
    this.setState({ address: prediction.description, showPredictions: false });
  }

API 响应上没有任何 placegeometry 属性:

Object {
  "description": "1234 Some Avenue Northeast, Washington, DC, USA",
  "id": "4c79fba1b3a5ad33478b79b54896a75a4d56ca53",
  "matched_substrings": Array [
    Object {
      "length": 4,
      "offset": 0,
    },
  ],
  "place_id": "ChIJneQ1fBO5t4kRf8mTw4ieb4Q",
  "reference": "ChIJneQ1fBO5t4kRf8mTw4ieb4Q",
  "structured_formatting": Object {
    "main_text": "1234 Some Avenue Northeast",
    "main_text_matched_substrings": Array [
      Object {
        "length": 4,
        "offset": 0,
      },
    ],
    "secondary_text": "Washington, DC, USA",
  },
  "terms": Array [
    Object {
      "offset": 0,
      "value": "1600",
    },
    Object {
      "offset": 5,
      "value": "Maryland Avenue Northeast",
    },
    Object {
      "offset": 32,
      "value": "Washington",
    },
    Object {
      "offset": 44,
      "value": "DC",
    },
    Object {
      "offset": 48,
      "value": "USA",
    },
  ],
  "types": Array [
    "street_address",
    "geocode",
  ],
}

【问题讨论】:

  • 除了预测之外,响应中应该还有其他属性,这些属性仅适用于用户实际选择其中之一之前的建议
  • 使用此数据,向 Places API 创建一个 Place Details Request,并返回 place_id,在上面的示例中为 ChIJneQ1fBO5t4kRf8mTw4ieb4Q
  • @MrUpsidown 这似乎是最好的方法。如果您将其发布为答案,很高兴将其标记为 答案。
  • 给你!见下文:)

标签: react-native google-maps-api-3


【解决方案1】:

获得地点 ID 后(ChIJneQ1fBO5t4kRf8mTw4ieb4Q 是您问题中的示例),您可以提出地点详细信息请求。

确保在 API 调用中包含 Places 库:https://maps.googleapis.com/maps/api/js?libraries=places 和有效的 API 密钥。

function initialize() {

    var map = new google.maps.Map(document.getElementById('map-canvas'), {
        center: new google.maps.LatLng(0, 0),
        zoom: 15
    });

    var service = new google.maps.places.PlacesService(map);

    service.getDetails({
        placeId: 'ChIJneQ1fBO5t4kRf8mTw4ieb4Q'
    }, function(place, status) {
        if (status === google.maps.places.PlacesServiceStatus.OK) {

            // Create marker
            var marker = new google.maps.Marker({
                map: map,
                position: place.geometry.location
            });

            // Center map on place location
            map.setCenter(place.geometry.location);
        }
    });
}

initialize();
#map-canvas {
  height: 160px;
}
<div id="map-canvas"></div>

<!-- Replace the value of the key parameter with your own API key. -->
<script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&libraries=places&callback=initialize">
</script>

【讨论】:

  • “地点详细信息请求”是正确的方法。但是,这个答案似乎是针对 Web 应用程序而不是 React Native,并且使用了google.maps,我很确定 RN 也没有访问权限。尽管如此,在我的情况下,通过简单的 fetch 来发出地点详细信息请求仍然有效。
  • 是的,这是针对 JS 应用程序的,但你明白了。您可以向web service 发出相同的请求。
【解决方案2】:

我找到了相同的解决方案-

就这样使用-

<GooglePlacesAutocomplete
        GooglePlacesDetailsQuery={{ fields: "geometry" }}
        fetchDetails={true} // you need this to fetch the details object onPress
        placeholder="Search"
        query={{
          key: "API_KEY_GOES_HERE",
          language: "en", // language of the results
        }}
        onPress={(data: any, details: any = null) => {
          console.log("data", data);
          console.log("details", details);
          console.log(JSON.stringify(details?.geometry?.location));
        }}
        onFail={(error) => console.error(error)} />

【讨论】:

    猜你喜欢
    • 2017-10-04
    • 2015-02-26
    • 2022-07-15
    • 2017-11-20
    • 1970-01-01
    • 2017-06-23
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多