Поведение геокодирования Cakephp - PullRequest
2 голосов
/ 28 ноября 2011

Я следил за этот урок . По сути, я хочу взять адрес из таблицы, которую я имею, и разместить этот адрес на карте Google. Учебное пособие кажется довольно простым, создайте таблицы мест, добавьте поведение и модель, а что нет.

Просто немного запутался, как бы я на самом деле использовал это с моими существующими таблицами. Я прочитал раздел в кулинарной книге о поведении, но все еще немного смущен им. Главным образом о том, как бы я интегрировал учебник в другие представления и контроллеры, которые не входят в модель места?

1 Ответ

2 голосов
/ 29 ноября 2011

сначала вам нужно добавить координаты широты / долготы в вашу адресную таблицу ...

вы можете сделать это с помощью анализатора записи вокруг этого вызова API Google Maps:

http://maps.google.com/maps/api/geocode/xml?address=miami&sensor=false

как только ваши адреса содержат координаты, все, что вам нужно, это передать координаты javascript карт Google в вашем представлении, просто скопируйте источник:

http://code.google.com/apis/maps/documentation/javascript/examples/map-simple.html

здесьоболочка cakephp 2.0 для создания данных широты и долготы

для запуска: "cake geo"

GeoShell.php:

<?php
class GeoShell extends Shell {

public $uses = array('Business');

public function main() {



    $counter = 0;
    $unique = 0;


    $temps = $this->Business->find('all', array(
        'limit' => 100
    ));

    foreach($temps as $t) {

            $address = $this->geocodeAddress($t['Business']['address']);

            print_r($address);

            if(!empty($address)) {
                $data['Business']['id'] = $t['Business']['id'];
                $data['Business']['lat'] = $address['latitude'];
                $data['Business']['lng'] = $address['longitude'];

                $this->Business->save($data, false);
                $unique++;
            }

    }

    $counter++;


    $this->out(' - Processed Records: ' . $counter . ' - ');
    $this->out(' - Inserted Records: ' . $unique . ' - ');

}


public function geocodeAddress($address) {

    $url = 'http://maps.google.com/maps/api/geocode/json?address=' . urlencode($address) . '&sensor=false';

    $response = @file_get_contents($url);

    if($response === false) {
        return false;
    }

    $response = json_decode($response);

    if($response->status != 'OK') {
        return false;
    }

    foreach ($response->results['0']->address_components as $data) {
        if($data->types['0'] == 'country') {
            $country = $data->long_name;
            $country_code = $data->short_name;
        }
    }

    $result = array(
        'latitude'  => $response->results['0']->geometry->location->lat,
        'longitude' => $response->results['0']->geometry->location->lng,
        'country' => $country,
        'country_code' => $country_code,
        'googleaddress' => $response->results['0']->formatted_address,
    );
    return $result;
}

}

...