I have the following code that converts address to latitude and longitude, but it works only if the input is given in single input, however i have a form that allows the user to input address, city, state and country in different lines, can anyone tell me how i can convert and save the given address into latitude and longitude
<?php
ob_start();
$con=mysqli_connect("localhost","root","","db");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
if($_POST)
{
$data_arr = geocode($_POST['address']); // get latitude, longitude and formatted address
if($data_arr)// if able to geocode the address
{
$latitude = $data_arr[0];
$longitude = $data_arr[1];
$formatted_address = $data_arr[2];
}
$address = mysqli_real_escape_string($con, $_POST['address']);
$sql="INSERT INTO register_office (co_address,latitude,longitude) VALUES ('$address', '$latitude', '$longitude')";
if (!mysqli_query($con,$sql))
{
die('Error: ' . mysqli_error($con));
}
}
mysqli_close($con);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="">
</head>
<body >
<form action="" method="post">
<input type='text' name='addressline1' placeholder='address line 1' />
<input type='text' name='addressline2' placeholder='address line 2' />
<input type='text' name='addressline3' placeholder='address line 3' />
<input type='text' name='city' placeholder='city' />
<input type='text' name='state' placeholder='state' />
<input type='text' name='country' placeholder='country' />
<input type='submit' value='Geocode!' />
</form>
<?php
// function to geocode address, it will return false if unable to geocode address
function geocode($address){
// url encode the address
$address = urlencode($address);
// google map geocode api url
$url = "http://maps.google.com/maps/api/geocode/json?sensor=false&address={$address}";
// get the json response
$resp_json = file_get_contents($url);
// decode the json
$resp = json_decode($resp_json, true);
// response status will be 'OK', if able to geocode given address
if($resp['status']='OK'){
// get the important data
$lati = $resp['results'][0]['geometry']['location']['lat'];
$longi = $resp['results'][0]['geometry']['location']['lng'];
$formatted_address = $resp['results'][0]['formatted_address'];
// verify if data is complete
if($lati && $longi && $formatted_address){
// put the data in the array
$data_arr = array();
array_push(
$data_arr,
$lati,
$longi,
$formatted_address
);
return $data_arr;
}else{
return false;
}
}else{
return false;
}
}
?>
</body>
</html>
You'd be best to check whether the values are empty as well... After that, concatenate them using a comma ,
, like so:
$addressFields = array(
$_POST['addressline1'],
$_POST['addressline2'],
$_POST['addressline1'],
$_POST['city'],
$_POST['state'],
$_POST['country'],
);
$addressData = implode(', ', array_filter($addressFields));
In this snippet, array_filter()
is used to filter all empty strings from the array. implode()
joins the array-items together in a string using a comma ,
as the 'glue'.
Afterwards, use the geocode()
method as in your example:
$data_arr = geocode($addressData);
Add the address parts together to form a single line and submit that to the Google Maps API instead.
$address_parts = array($addressline1, $addressline2, $addressline3, $city, $state, $country);
$address = implode(", ", $address_parts); // join the parts together divided by comma
It sounds like you should be able to concatenate your address parts together and then send that in?
Eg
$address = $_POST['addressline1'] .','. $_POST['addressline2'] <<snip>> $_POST['country'];
$data_arr = geocode($address);
If google has trouble with repeating commas you may need to build a bit of an if
statement to only put in the bits that are actually set (at which point building an array and imploding it will probably be better)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.