superbigco / craft-vzaddress

A simple address field for Craft.
MIT License
4 stars 3 forks source link

Geocode Address #2

Open agrigg opened 5 years ago

agrigg commented 5 years ago

It would be great to save the latitude and longitude for the address when it is saved / changed using the Google Geocoding API.

Something like using the below geocode method and then saving those additional values in Craft with the address info.

// 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 = "https://maps.googleapis.com/maps/api/geocode/json?address={$address}&key=YOUR_API_KEY";

    // 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 = isset($resp['results'][0]['geometry']['location']['lat']) ? $resp['results'][0]['geometry']['location']['lat'] : "";
        $longi = isset($resp['results'][0]['geometry']['location']['lng']) ? $resp['results'][0]['geometry']['location']['lng'] : "";
        $formatted_address = isset($resp['results'][0]['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{
        echo "<strong>ERROR: {$resp['status']}</strong>";
        return false;
    }
}
sjelfull commented 5 years ago

Thanks for the feedback, I think this is a good idea. Feel free to submit a PR if possible.

agrigg commented 5 years ago

Cool. I'm working on a PR. I see you already have a geocode method, it is just calling it every time it renders the map. I have most of this in place, but I'm stuck on where to do the save. You have any suggestions on how to hook in? I posted a question on Stack Exchange about it here: https://craftcms.stackexchange.com/questions/31128/geocode-address-when-saving-custom-field-type-in-plugin

agrigg commented 5 years ago

Created a PR here: https://github.com/superbigco/craft-vzaddress/pull/3