Google Places API - 使用该城市查找地址

时间:2012-05-05 15:28:27

标签: javascript google-maps google-places-api

我打算使用Google Places API在我的网站上创建地址自动填充功能。我的问题是关于我的要求是否可以使用Google商家信息。

我有一个“发布请求”页面,用户在该页面上发布地址(城市,街道和门牌号码)。我还有一个“搜索”页面,用户可以根据城市搜索帖子。在这里,用户只插入城市名称,没有街道和门牌号。

我的问题:

  1. 我可以强制用户插入城市,街道和门牌号码(仅插入城市或仅插入城市和街道会提醒无效输入,或者自动完成仅返回城市,街道和房屋的结果数)

  2. 我可以强制用户仅插入城市(没有街道和门牌号码)吗?

  3. 假设用户使用“MyCity,MyStreet 12”发布了一个地址。在应用程序的后台,我得到了这个特定位置的id并存储它。另一个用户正在搜索帖子并插入“MyCity”。在后台我得到了“MyCity”的具体ID,并使用此id来搜索我的数据库。如何找到第一个用户的结果:“MyCity,MyStreet 12”使用“MyCity”键?
    换句话说,假设我有一个代表城市的位置ID和代表完全地址(城市,街道,门牌号码)的其他位置ID,如何仅使用ID检查完整地址是否属于城市?

3 个答案:

答案 0 :(得分:10)

就用户在与Autocomplete dev-guide关联的输入框中键入的内容而言,您无法控制他们键入的内容。但是,当您设置Autocomplete api-doc时,您可以定义控制将返回的结果的选项。您的关键是正确设置types选项。

具体针对您的问题#1 ,您可以将Autocomplete设置为types,将geocode中返回的结果限制为var defaultBounds = new google.maps.LatLngBounds( new google.maps.LatLng(-33.8902, 151.1759), new google.maps.LatLng(-33.8474, 151.2631)); var input = document.getElementById('searchTextField'); var options = { bounds: defaultBounds, types: ['geocode'] }; autocomplete = new google.maps.places.Autocomplete(input, options); ,如图所示在这个例子中:

Autocomplete

根据您的问题#2 ,您可以将types设置为cities,将var input = document.getElementById('searchTextField'); var options = { types: ['(cities)'], componentRestrictions: {country: 'fr'} }; autocomplete = new google.maps.places.Autocomplete(input, options); 中返回的结果限制为城市,如下所示:

Autocomplete

另请注意,由于(cities)仅限于componentRestrictions,因此我添加了bounds说明符来设置搜索城市的国家/地区(在本例中为法国)并删除了City说明符。

根据您的问题#3 ,您可以创建两个表,一个用于存储城市数据,另一个用于存储地址数据,如下面的UML图所示:

enter image description here

根据您问题中的描述,此设计有一些关键方面:

  • AddressAddress之间存在一对多的关系。这样,您就可以将多个City记录与单个Address记录相关联。它还可以轻松检索为City输入的所有Address条记录。
  • CityAddress之间的关系表明,对于每个 City,必须存在Address。这意味着当用户输入City时,您必须执行以下操作:1 - 检查数据库中是否已存在Address的{​​{1}}。 2 - 如果存在City ,则检索其ID并在存储新City-ID时将其用作外键Address值。 3 - 如果City 不存在,则必须为ID创建新的唯一City,并且City必须存储在ID中数据库。然后,City的{​​{1}}可以在存储City-ID时用作外键Address值。确保每个Address都有关联的City回答您在问题#3中提出的问题之一:如何找到第一个用户的结果:“MyCity,MyStreet 12“使用”MyCity“密钥?因为当您存储”MyCity,MyStreet 12“Adress记录时,您确保City表中存在”MyCity“记录。如果其他用户输入相同的ID或与用户输入的City相同的City,则检索Address的{​​{1}}非常简单未来。
  • CityCity之间的关系表明,对于任何Address,可能存在零个或多个关联的City个记录。这样,即使没有进行后续Address次搜索,您的描述中仅搜索City的用户也可以存储City。存储了Address,它有一个City,它只是等待稍后可能添加的任何新ID记录。

最后,你问了另一个问题作为问题#3的一部分:如何才能使用ID检查完整地址是否属于城市?能够回答这个问题的原因是是一个外键Address,它是每个City-ID记录的一部分。它明确定义了与Address相关联的City。因此,如果AddressIDCityID,则确定它们是否匹配的最简单方法是:1 - 检索{{ 1}}使用Address Address从数据库中获取。 2 - 将刚从数据库中检索到的Address的{​​{1}}值与您开始使用的ID的{​​{1}}进行比较;如果匹配,则表示City-IDAddress相关联,如果不匹配,您可以确定IDCity之间没有任何关系}。

我不完全确定您要通过地址和城市实现目标,但我试图为您提供一个可靠的解决方案,涵盖您在问题中描述的内容。我提供了大量细节,以便解决您的所有要点,并希望它能使我的描述清晰易懂。我希望这可以帮助你 -

答案 1 :(得分:0)

这比谷歌地方更像是一个Javascript问题。

使用Javascript例程验证表单,并在#1的情况下检查是否填写了所有字段。另一方面,对于案例#2,您可以禁用/删除不想填写的字段,并仅使用您要发送的内容发布请求。

对于#3,这只是一个缓存问题。使用localStorage或数组将城市存储为密钥,将结果存储为值。

答案 2 :(得分:0)

Google地方信息将帮助您的用户自动填写他们的地址,Sean Mickey描述:

  1. 他们开始在单个字段中输入街道地址
  2. Google向他们提供了可能的匹配地址列表
  3. 他们选择一个,然后您回复like this
  4. 该回复中的id将用于他们的街道地址,而不是城市。所以它不会像你想要的那样有用。如果你想匹配城市,你需要存储城市的名称(如果你想要你可以创建自己的id表)。

    考虑一下如何在数据库中实现位置搜索:

    • 按城市搜索(错过居住在城市范围之外的人)
    • 按距离搜索(查找某个半径范围内的所有人)

    如果您选择按距离搜索,则还应存储Google地方信息在用户输入地址时为您提供的纬度和经度。您还需要了解如何在数据库中执行spatial search(尤其是geodist)。