
Google will always provide the results that we believe are most relevant to your search . Location is one of a number of factors that we use to provide these relevant results . For example , if you search for a restaurant chain , you may want to find one near you . When searching for movie showtimes , you may want listings in your area . Such search results are made possible by location-based customization . The location used to customize your results is clearly indicated on the left side of your results page . Our location detection technology will automatically set a location for you , or you can easily specify an alternate location . Automatically detected location To provide you with the most relevant results , Google attempts to automatically detect your location and customize results based on that detected location . A location that 's labeled " Auto-detected " is chosen based on the following factors : Your IP address . Google Toolbar 's My Location feature . If you have Google Toolbar installed and have the My Location feature enabled , your approximate location ( if detected ) will be used to customize your search results . If you do n't want Toolbar to attempt to determine your approximate location , you can turn off My Location See the wrong location ? We 're continuing to improve our location detection technology , and the automatically detected location may be less accurate in certain areas . If you notice an incorrect location , please set your location manually by following the instructions below . If you 're being redirected to a Google domain that does n't match the country you 're in ( for example , Google . com . au instead of Google . com ) , please let us know ; we may be incorrectly detecting your IP address . Do n't see a location ? Sometimes we wo n't show any location if we ca n't accurately determine one for you . We 're working hard to improve our location detection technology . Also , the location setting will not always be available depending on your language and region . We are working to make the location setting more widely available . In the meantime , if you do n't have any location shown , it 's easy to set a location yourself by following the instructions below . Specify your preferred location If you 'd like to change your location , click Change Location and enter a street address , zip code , city and state , or country in the box that appears . Click Set to save your location setting . You can only specify a location within the country of your current Google domain . For instance , it 's not possible to set a U. S. address on www . google . es , the Google domain for Spain . If you 'd like to see results for a region outside of your Google domain , please specify the location in the search query ( like [ bicycle repair paris ] ) or visit a different Google local domain instead . If you don’t already have a location set , enter a location in the box next to " Search near , " then click Set . Your manually set location will be saved in a browser cookie on your specific computer and internet browser only . When you use the same computer and browser , this manually set location will be used to customize your search results instead of the automatically detected location . If your location preference doesn’t remain saved on the browser or computer where you set it , please check your browser settings . To clear your manually set location , click on the auto-detected location . This will clear the location setting saved in your browser cookie , and your results will be customized based on the automatically detected location . Can I turn off location-based customization ? The customization of search results based on location is an important component of a consistent , high-quality search experience . Therefore , we have n't provided a way to turn off location customization , although we 've made it easy for you to set your own location or to customize using a general location as broad as the country that matches your local domain . If you find that your results for a particular search are more local than what you 're looking for , you can set your location to a broader geographical area ( such as a country instead of a city , zip code , or street address ) . Please note that this will greatly reduce the amount of locally relevant results that you’ll see . What information about location does Google store ? Google has many services that collect or use location data , including Google Maps , Latitude , Toolbar , and others . If you have questions about our privacy policy , please refer to our privacy center . 