Je veux obtenir la latitude et la longitude d'un lieu à partir d'une adresse. Je ne veux pas obtenir la latitude et la longitude du GPS ni du réseau.
Je veux que l'utilisateur puisse taper dans TextView l'adresse de l'endroit qu'il veut (par exemple son bureau) et en dessous du champ de texte, certaines suggestions seront affichées, tout comme lorsque vous tapez l'adresse dans l'application google maps. Ensuite, je veux récupérer les coordonnées de l'adresse donnée.
Si cela ne peut pas être fait, existe-t-il un moyen d'obtenir l'adresse via l'application Google Maps elle-même. Peut-être que je pourrais appeler les gmaps depuis mon application et l'utilisateur tapera l'adresse et les gmaps retourneront les coordonnées.
Comment puis-je le faire?
L'API Geocoder fournie dans le Android Framework
J'ai déjà travaillé avec le API de géocodage qui existe dans le Android API mais cela ne fonctionne pas sur tous les appareils. En fait, selon mes expériences et celles d'autres, un de nombreux appareils renverront null lors de l'utilisation de l'API de géocodage.
Pour cette raison, j'ai choisi d'utiliser le géocodeur inversé qui fonctionne parfaitement sur tous les appareils, mais nécessite une surcharge supplémentaire en raison de la demande HTTP.
Récupération de la longitude et de la latitude d'une adresse à l'aide de l'API de géocodage inversé
Pour éviter ce problème, il suffit d'utiliser Reverse Geocoding API qui renvoie un objet JSON.
Vous pouvez soit utiliser l'API pour rechercher une adresse via la latitude et la longitude, soit rechercher la latitude et la longitude à partir d'une adresse:
Retour:
{
"results" : [
{
"address_components" : [
{
"long_name" : "1600",
"short_name" : "1600",
"types" : [ "street_number" ]
},
{
"long_name" : "Amphitheatre Pkwy",
"short_name" : "Amphitheatre Pkwy",
"types" : [ "route" ]
},
{
"long_name" : "Mountain View",
"short_name" : "Mountain View",
"types" : [ "locality", "political" ]
},
{
"long_name" : "Santa Clara",
"short_name" : "Santa Clara",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "California",
"short_name" : "CA",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "United States",
"short_name" : "US",
"types" : [ "country", "political" ]
},
{
"long_name" : "94043",
"short_name" : "94043",
"types" : [ "postal_code" ]
}
],
"formatted_address" : "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
"geometry" : {
"location" : {
"lat" : 37.42291810,
"lng" : -122.08542120
},
"location_type" : "ROOFTOP",
"viewport" : {
"northeast" : {
"lat" : 37.42426708029149,
"lng" : -122.0840722197085
},
"southwest" : {
"lat" : 37.42156911970850,
"lng" : -122.0867701802915
}
}
},
"types" : [ "street_address" ]
}
],
"status" : "OK"
}
Par la présente, il suffit d'envoyer une requête HTTP à l'API de géocodage inversé avec une adresse entrée par l'utilisateur, puis d'analyser l'objet JSON pour trouver les données dont vous avez besoin.
Un article précédent décrit comment n objet JSON peut être analysé à partir d'une URL .
J'espère que cela t'aides.
Vous pouvez utiliser la méthode ci-dessous:
Geocoder coder = new Geocoder(this);
try {
ArrayList<Address> adresses = (ArrayList<Address>) coder.getFromLocationName("Your Address", 50);
for(Address add : adresses){
if (statement) {//Controls to ensure it is right address such as country etc.
double longitude = add.getLongitude();
double latitude = add.getLatitude();
}
}
} catch (IOException e) {
e.printStackTrace();
}
/**
* @method getLocationFromAddress
* @param strAddress Address/Location String
* @desc Get searched location points from address and plot/update on map.
*/
public void getLocationFromAddress(String strAddress)
{
//Create coder with Activity context - this
Geocoder coder = new Geocoder(this);
List<Address> address;
try {
//Get latLng from String
address = coder.getFromLocationName(strAddress,5);
//check for null
if (address == null) {
return;
}
//Lets take first possibility from the all possibilities.
Address location=address.get(0);
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
//Put marker on map on that LatLng
Marker srchMarker = mMap.addMarker(new MarkerOptions().position(latLng).title("Destination").icon(BitmapDescriptorFactory.fromResource(R.drawable.bb)));
//Animate and Zoon on that map location
mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
mMap.animateCamera(CameraUpdateFactory.zoomTo(15));
} catch (IOException e)
{
e.printStackTrace();
}
}
Ce dont vous avez besoin est: http://developer.Android.com/reference/Android/location/Geocoder.html .
Vous pouvez l'utiliser comme ça:
List<Address> result = new Geocoder(context).getFromLocationName(locationName, maxResults);
Vous obtiendrez une liste de Address
et vous pourrez ensuite appeler getLatitude
et getLongitude
sur ces adresses.