the street portion of the location
* 'supplemental' => additional street portion of the location
* 'province' => the province, state, or territory
* 'country' => lower-cased two-letter ISO code (REQUIRED)
* 'postal_code' => the international postal code for this location (REQUIRED)
*
* @return
* An associative array where
* 'lat' => approximate latitude of the center of the postal code's area
* 'lon' => approximate longitude of the center of the postal code's area
*
*/
function location_latlon_rough_ca($location = array()) {
if (!isset($location['postal_code'])) {
return NULL;
}
$result = db_query("SELECT latitude, longitude FROM {zipcodes} WHERE country = '%s' AND zip = '%s'", $location['country'], $location['postal_code']);
if ($row = db_fetch_object($result)) {
return array('lat' => $row->latitude, 'lon' => $row->longitude);
}
else {
return NULL;
}
}
/**
* Returns a lat/lon pair of the approximate center of the given postal code in the given country
*
* @param $location
* An associative array $location where only postal code and country are necessary, but can have the keys:
* 'street' => the street portion of the location
* 'supplemental' => additional street portion of the location
* 'province' => the province, state, or territory
* 'country' => lower-cased two-letter ISO code (REQUIRED)
* 'postal_code' => the international postal code for this location (REQUIRED)
*
* @return
* An associative array where
* 'lat' => approximate latitude of the center of the postal code's area
* 'lon' => approximate longitude of the center of the postal code's area
* 'city' => the city
* 'province' => the province, state, or territory
* 'country' => lower-cased two-letter ISO code
*
*/
function location_get_postalcode_data_ca($location = array()) {
// Now we pad the thing and query.
$res = db_query("SELECT * FROM {zipcodes} where country = '%s' AND zip = '%s'", $location['country'], $location['postal_code']);
if ($row = db_fetch_object($res)) {
return array('lat' => $row->latitude, 'lon' => $row->longitude, 'city' => $row->city, 'province' => $row->state, 'country' => $row->country);
}
else {
return NULL;
}
}
/**
* Parameters:
* An associative array $location where
* 'street' => the street portion of the location
* 'supplemental' => additional street portion of the location
* 'province' => the province, state, or territory
* 'country' => lower-cased two-letter ISO code (REQUIRED)
* 'postal_code' => the international postal code for this location (REQUIRED)
*
*
*/
function location_latlon_exact_ca($location = array()) {
// return location_geocode_ca_geocoder($location);
}
function location_map_link_ca_yahoo($location = array()) {
$get_query = '?';
if (isset($location['street'])) {
$get_query .= 'addr='. urlencode($location['street']) .'&';
}
if ($location['province'] != '' || $location['city'] != '' || $location['postal_code'] != '') {
$get_query .= 'csz='. _location_ca_yahoo_csz_get_field($location) .'&';
}
$get_query .= 'country='. urlencode($location['country']);
return ('http://ca.maps.yahoo.com/maps_result'. $get_query);
}
function location_map_link_ca_google($location = array()) {
$query_params = array();
foreach (array('street', 'city', 'province', 'postal_code', 'country') as $field) {
if (isset($location[$field])) {
$query_params[] = $location[$field];
}
}
if (count($query_params)) {
return ('http://maps.google.ca?q='. urlencode(implode(", ", $query_params)));
}
else {
return NULL;
}
}
function location_map_link_ca_mapquest($location = array()) {
if (isset($location['street'])) {
$get_query .= 'address='. urlencode($location['street']) .'&';
}
if (isset($location['city'])) {
$get_query .= 'city='. urlencode($location['city']) .'&';
}
if (isset($location['province'])) {
$get_query .= 'state='. urlencode($location['province']) .'&';
}
if (isset($location['postal_code'])) {
$get_query .= 'zipcode='. urlencode($location['postal_code']);
}
if (strlen($get_query)) {
return 'http://www.mapquest.com/maps/map.adp?searchtype=address&country=CA&'. $get_query;
}
else {
return NULL;
}
}
function location_map_link_ca_providers() {
return array('google' => array('name' => 'Google Maps', 'url' => 'http://maps.google.ca', 'tos' => 'http://www.google.ca/help/terms_local.html'),
'yahoo' => array('name' => 'Yahoo! Maps', 'url' => 'http://ca.maps.yahoo.com' , 'tos' => 'http://help.yahoo.com/help/ca/maps/maps-25.html'),
'mapquest' => array('name' => 'MapQuest', 'url' => 'http://www.mapquest.com', 'tos' => 'http://www.mapquest.com/features/main.adp?page=legal')
);
}
function location_map_link_ca_default_providers() {
return array('google');
}
/**
* Parameters:
* -> $locationA is an associative array that represents a full location where
* 'street' => the street portions of the location
* 'supplemental' => additional street portion of the location
* 'province' => the province, state, or territory
* 'country' => lower-cased two-letter ISO code (REQUIRED)
* -> $locationB is associative array that represents a full location in the same way that
* parameter $locationB does.
*
* Returns: a link to driving directions
*
* For now, assume site-admin wants American driving directions linked to Yahoo! Driving Directions.
* Maybe later, we can add some kind of country-specific settings page that allows the site-admin to
* decide which site to link to for driving directions.
*/
function location_driving_directions_link_ca($locationA, $locationB) {
return _location_driving_directions_link_ca_yahoo($locationA, $locationB);
}
/**
* Parameters:
* Function that is called by location_driving_directions_link_ca() under assumption that it
* is the chosen function
*
* Returns:
* a URL with HTTP GET variables
* Depending on how full the locationes are, the URL will either point to the driving directions
* on Yahoo! or, if only partial locationes are provided, a URL that points to the *form* for
* Yahoo! driving directions where the form is filled with whatever fields have been provided
* for the partial location(es).
*/
function _location_driving_directions_link_ca_yahoo($locationA, $locationB) {
if (trim($locationB['country']) != 'ca' && trim($locationB['country']) != 'us') {
return '';
}
// These are the fields that need to be in each location if we are to provide a direct
// link to yahoo directions. If all of these fields don't have values, then we generate
// a link to the *form* for Yahoo! driving directions rather than directly to the driving
// directions themselves.
foreach ($locationA as $field => $value) {
$locationA[$field] = trim($value);
}
foreach ($locationB as $field => $value) {
$locationB[$field] = trim($value);
}
if (_location_ca_enough_fields_for_yahoo($locationA) && _location_ca_enough_fields_for_yahoo($locationB)) {
$yahoo_maps_path = 'dd_result';
}
else {
$yahoo_maps_path = 'dd';
}
$get_query = '?';
$get_query .= 'addr='. urlencode($locationA['street']) .'&';
$get_query .= 'csz=' . _location_ca_yahoo_csz_get_field($locationA) .'&';
$get_query .= 'country='. urlencode($locationA['country']) .'&';
$get_query .= 'taddr='. urlencode($locationB['street']) .'&';
$get_query .= 'tcsz=' . _location_ca_yahoo_csz_get_field($locationB) .'&';
$get_query .= 'tcountry='. urlencode($locationB['country']);
$get_query .= '&getrte='. urlencode('Get Directions');
return ('http://ca.maps.yahoo.com/'. $yahoo_maps_path . $get_query);
}
function _location_ca_enough_fields_for_yahoo($location) {
// These are the fields that need to be in each location if we are to provide a direct
// link to yahoo directions. If all of these fields don't have values, then we generate
// a link to the *form* for Yahoo! driving directions rather than directly to the driving
// directions themselves.
if (strlen($location['street']) && strlen($location['city']) && strlen($location['province'])) {
return TRUE;
}
if (strlen($location['street']) && strlen($location['postal_code'])) {
return TRUE;
}
if (strlen($location['street']) && strlen($location['city']) && strlen($location['province'])) {
return TRUE;
}
return FALSE;
}
// Don't mess with this function unless you understand its logic. It has to do with
// the question of "to comma or not to comma?"
function _location_ca_yahoo_csz_get_field($location) {
// For some reasons, to the end of pinpointing a location, Yahoo! Maps and Driving Directions
// do better a better job with retrieving info based strictly on a Canadian city/province
// than on a Canadian postal code.
if ($location['country'] = 'ca') {
if (strlen($location['city']) && strlen($location['province'])) {
return urlencode($location['city'] .', '. $location['province']);
}
if (strlen($location['postal_code'])) {
return urlencode($location['postal_code']);
}
}
else {
if (strlen($location['postal_code'])) {
return urlencode($location['postal_code']);
}
if (strlen($location['city']) && strlen($location['province'])) {
return urlencode($location['city'] .', '. $location['province']);
}
}
if (strlen($location['city']) || strlen($location['state'])) {
if (strlen($location['city'])) {
return urlencode($location['city']);
}
else {
return urlencode($location['state']);
}
}
return '';
}
function location_geocode_ca_providers() {
return array(
'geocoder' => array('name' => 'GeoCode.ca geocoding service', 'url' => 'http://geocoder.ca/?api=1', 'tos' => 'http://geocoder.ca/?terms=1http://geocoder.ca/?terms=1'),
);
}
function location_geocode_ca_geocoder_settings(){
$form = array();
$form['location_geocode_ca_geocoder_apikey'] = array(
'#type' => 'textfield',
'#title' => t('Geocoder API Key'),
'#size' => 64,
'#maxlength' => 128,
'#default_value' => variable_get('location_geocode_ca_geocoder_apikey', ''),
'#description' => t('In order to use the Geocoder.ca API geocoding web-service, you for a commercial entity or without attribution you will need a Geocoder API Key. You can obtain one at the !sign_up_link for the !geocoder_api.', array('!sign_up_link' => 'sign-up page', '!geocoder_api' => 'Geocoder API'))
);
return $form;
}
/**
* This needs some more work to cover errors and such. I think showing a proper
* Drupal error is a good idea. If an incorrect address is given to geocoder.ca
* it offers a suggestion. If this happens the drupal user should be told.
*/
function location_geocode_ca_geocoder($location = array()) {
$service_url = "http://geocoder.ca/?geoit=XML";
if (variable_get('location_geocode_ca_geocoder_apikey', NULL)) {
$service_url .= '&auth='. variable_get('location_geocode_ca_geocoder_apikey', NULL) .'&locate=';
}
else {
$service_url .= '&locate=';
}
// geocoder gives better results when not usong postal code, country and ,
unset($location['postal_code'], $location['country']);
$address = strtr(location_address2singleline($location), array(', ' => ' '));
$http_reply = drupal_http_request($service_url . urlencode($address));
if ($http_reply->code == 400) {
return NULL;
}
else {
$matches = array();
$lat_match = array();
$lon_match = array();
$latlon = array();
if (preg_match('/(.*)<\/error>/', $http_reply->data, $lat_match)) {
return NULL;
}
if (preg_match('/(.*)<\/latt>/', $http_reply->data, $lat_match)) {
$latlon['lat'] = $lat_match[1];
}
else {
return NULL;
}
if (preg_match('/(.*)<\/longt>/', $http_reply->data, $lon_match)) {
$latlon['lon'] = $lon_match[1];
return $latlon;
}
else {
return NULL;
}
}
}
function location_province_list_ca() {
return array('AB' => 'Alberta',
'BC' => 'British Columbia',
'MB' => 'Manitoba',
'NB' => 'New Brunswick',
'NL' => 'Newfoundland and Labrador',
'NS' => 'Nova Scotia',
'ON' => 'Ontario',
'PE' => 'Prince Edward Island',
'QC' => 'Quebec',
'SK' => 'Saskatchewan',
'NT' => 'Northwest Territories',
'NU' => 'Nunavut',
'YT' => 'Yukon Territory');
}
function location_province_list_numeric_ca() {
return array('001' => 'Alberta',
'002' => 'British Columbia',
'003' => 'Manitoba',
'004' => 'New Brunswick',
'005' => 'Newfoundland and Labrador',
'006' => 'Nova Scotia',
'007' => 'Ontario',
'008' => 'Prince Edward Island',
'009' => 'Quebec',
'010' => 'Saskatchewan',
'011' => 'Northwest Territories',
'012' => 'Nunavut',
'013' => 'Yukon Territory');
}
?>