简体   繁体   中英

convert address to latitude and longitude in php

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM