Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
213 views
in Technique[技术] by (71.8m points)

javascript - Google Places API - find an address using the city

I am planning to use Google Places API in order to create an address autocomplete in my web site. My question is about whether my requirements are possible using Google Places.

I have a "Post Request" page where the user posts an address (city, street and house number). I also have a "Search" page where the user can search posts according to the city. Here the user only inserts a city name, without a street and house number.

My questions:

  1. Can I force the user to insert a city, street and house number (inserts of only city or only city and street for example will alert invalid input, or the autocomplete will return only results of city, street and house number)?

  2. Can I force the user insert city only (without street and house number)?

  3. Assuming the user posts an address with "MyCity, MyStreet 12". In the background of the application I get an id of this specific location and store it. Another user is searching for posts and inserts "MyCity". In the background I get the specific id of "MyCity" and use this id in order to search in my db. How can I find the result of the first user: "MyCity, MyStreet 12" using "MyCity" key?
    In other words, assume I have a location id that represents a city and other location id that represents fully address (city, street, house number), how can I check if the fully address belong to the city using the ids only?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

As far as what the user types into the input box that is associated with the Autocompletedev-guide, there isn't very much you can do to control what they type. However, when you set up the Autocompleteapi-doc, you can define options that control the results that will come back. The key for you will be setting up the types option correctly.

Specific to your question #1, you can restrict the results that will come back in the Autocomplete to addresses by setting types to geocode as shown in this example:

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

Specific to your question #2, you can restrict the results that come back in the Autocomplete to cities by setting types to cities as shown here:

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

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

Also notice that because the Autocomplete has been restricted to (cities), I have added a componentRestrictions specifier to set the country within which to search for cities (in this case, France) and removed the bounds specifier.

Specific to your question #3, you can create two tables, one to store City data, the other to store Address data, as shown in the following UML diagram:

enter image description here

Based on the description in your question, there are some key aspects of this design:

  • There is a one-to-many relationship from City to Address. This will allow you to associate many Address records to a single City record. It will also make it simple to retrieve all of the Address records that have been entered for any City.
  • The relationship between Address and City says that for every Address, a City must exist. This means that when a user enters an Address, you must take the following actions: 1 - Check to see if the City for the Address already exists in the database. 2 - If the City does exist, retrieve its ID and use that as the foreign key City-ID value when storing the new Address. 3 - If the City does not exist, a new unique ID must be created for the City and the City must be stored in the database. Then the ID for the City may be used as the foreign key City-ID value when storing the Address. Making sure that every Address has an associated City answers one of the questions you ask as part of your question #3: How can I find the result of the first user: "MyCity, MyStreet 12" using "MyCity" key? Because when you stored the "MyCity, MyStreet 12" Adress record, you made sure a "MyCity" record exists in the City table. Retrieving the ID for the City is straightforward if another user enters the same City or an Address associated with the same City is entered by a user in the future.
  • The relationship between City and Address says that for any City there may be zero or more associated Address records. This ensures that the user in your description that searches for just a City may store the City even if no follow-up Address searches take place. The City is stored, it has an ID, and it is just waiting for any new Address records that may be added later.

Finally, you asked one more question as part of question #3: how can I check if the fully address belong to the city using the ids only? Being able to answer this question is why there is a foreign key City-ID that is part of every Address record. It clearly defines the City that is associated with any Address. So if you have the ID for a City and the ID for an Address, the simplest way to determine if they are a match is: 1 - Retrieve the Address from the database using the Address ID. 2 - Compare the City-ID value that is part of the Address that was just retrieved from the database with the ID for the City you started with; if they match, you know the Address is associated with the City and if they don't match, you can be sure there is no relationship between that Address and that City.

I'm not entirely sure what you are trying to achieve with the addresses and the cities, but I've tried to give you a solid solution that covers the things you describe in your question. I included a great deal of detail so that all of your points are addressed and in the hope that it will make my description clear and easy to understand. I hope this helps you -


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...