7

我计划使用 Google Places API 在我的网站中创建地址自动填充功能。我的问题是关于我的要求是否可以使用 Google Places。

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

我的问题:

  1. 我可以强制用户插入城市、街道和门牌号(例如,仅插入城市或仅插入城市和街道会提示无效输入,或者自动完成将仅返回城市、街道和门牌号的结果)?

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

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

4

3 回答 3

10

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

具体到您的问题#1 ,您可以通过设置为来限制将返回Autocomplete到地址的结果,如下例所示:typesgeocode

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);

具体到您的问题#2,您可以通过设置为如下所示来限制返回Autocomplete到城市的结果:typescities

var input = document.getElementById('searchTextField');
var options = {
  types: ['(cities)'],
  componentRestrictions: {country: 'fr'}
};

autocomplete = new google.maps.places.Autocomplete(input, options);

另请注意,由于Autocomplete已被限制为(cities),我添加了一个componentRestrictions说明符来设置搜索城市的国家(在本例中为法国)并删除了bounds说明符。

具体到你的问题#3,你可以创建两张表,一张存储City数据,一张存储Address数据,如下UML图所示:

在此处输入图像描述

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

  • City从到有一对多的关系Address。这将允许您将许多Address记录关联到单个City记录。它还将使检索Address任何已输入的所有记录变得简单City
  • Address和之间的关系City表明对于每个 Address, aCity必须存在。这意味着当用户输入 时Address,您必须采取以下措施: 1 - 检查数据库中是否City已经Address存在。2 - 如果City 确实存在,则在存储新的 时检索其ID并将其用作外键值。3 - 如果存在,则必须为该创建一个新的唯一性,并且必须将其存储在数据库中。那么在存储. _ 确保每个人都有相关的City-IDAddressCity IDCityCityIDCityCity-IDAddressAddressCity回答您在问题 #3 中提出的一个问题:如何使用“MyCity”键找到第一个用户的结果:“MyCity, MyStreet 12”?因为当您存储“MyCity, MyStreet 12”Adress记录时,您确保表中存在“MyCity”记录City。如果另一个用户输入相同的或与相同的关联的用户将来输入的,则检索IDfor很简单。CityCityAddressCity
  • City和之间的关系Address表示,对于任何City可能有零个或多个关联Address记录。这确保了即使没有进行后续搜索,您描述中仅搜索 a 的用户City也可以存储。被存储,它有一个,它只是在等待以后可能添加的任何新记录。CityAddressCityIDAddress

最后,作为问题 #3 的一部分,您又问了一个问题:如何仅使用 id 来检查完整地址是否属于城市?能够回答这个问题就是为什么City-ID每条Address记录都有一个外键。它清楚地定义了City与 any 相关联的Address。因此,如果您有IDfor aCityIDfor an Address,确定它们是否匹配的最简单方法是: 1 -使用 .Address从数据库中检索Address ID. 2 - 将刚刚从数据库中检索到的值与您开始使用的City-ID值进行比较;如果它们匹配,您就知道与AddressIDCityAddressCity如果它们不匹配,您可以确定 thatAddress和 that之间没有关系City

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

于 2012-05-22T09:45:58.877 回答
0

这比 Google Places 更像是一个 Javascript 问题。

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

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

于 2012-05-22T05:37:17.753 回答
0

正如 Sean Mickey 所描述的,Google Places 将帮助您的用户自动填写他们的地址:

  1. 他们开始在一个字段中输入他们的街道地址
  2. 谷歌给他们一个可能匹配地址的列表
  3. 他们选择一个,你会得到这样的回应

id响应将针对他们的街道地址,而不是针对城市。所以它不会以你想要的方式有用。如果要匹配城市,则需要存储城市的名称(如果需要,可以创建自己的 id 表)。

想想你想如何在你的数据库中实现位置搜索:

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

如果您选择按距离搜索,您还应该存储 Google Places 在用户输入地址时返回给您的纬度和经度。您还需要阅读如何在数据库中进行空间搜索(尤其是 geodist)。

于 2012-05-26T03:28:35.873 回答