View source
<?php
function location_latlon_rough_us($location = array()) {
if (!isset($location['postal_code'])) {
return NULL;
}
$row = db_query("SELECT latitude, longitude FROM {zipcodes} where country = :country AND zip = :zip", array(
':country' => $location['country'],
':zip' => substr(str_pad($location['postal_code'], 5, '0', STR_PAD_LEFT), 0, 5),
))
->fetchObject();
if ($row) {
return array(
'lat' => $row->latitude,
'lon' => $row->longitude,
);
}
else {
return NULL;
}
}
function location_get_postalcode_data_us($location = array()) {
$dash_index = strpos($location['postal_code'], '-');
if (!($dash_index === FALSE)) {
$location['postal_code'] = substr($location['postal_code'], 0, $dash_index);
}
$row = db_query("SELECT * FROM {zipcodes} where country = :country AND zip = :zip", array(
':country' => $location['country'],
':zip' => str_pad($location['postal_code'], 5, "0", STR_PAD_LEFT),
))
->fetchObject();
if ($row) {
return array(
'lat' => $row->latitude,
'lon' => $row->longitude,
'city' => $row->city,
'province' => $row->state,
'country' => $row->country,
);
}
else {
return NULL;
}
}
function location_latlon_exact_us($location = array()) {
return NULL;
}
function _location_latlon_exact_us_geocoder($location = array()) {
$location_string = '';
if (isset($location['street']) && trim($location['street']) != '') {
if (isset($location['postal_code'])) {
$location_string = $location['street'] . ' ' . $location['postal_code'];
}
elseif (isset($location['city']) && isset($location['province']) && trim($location['city']) != '' && trim($location['province'])) {
$location_string = $location['street'] . ', ' . $location['city'] . ', ' . $location['province'];
}
else {
return NULL;
}
}
else {
return NULL;
}
$result = xmlrpc('http://rpc.geocoder.us/service/xmlrpc', array(
'geocode' => array(
$location_string,
),
));
if (is_array($result) && is_array($result[0]) && isset($result[0]['lat']) && is_numeric($result[0]['lat']) && isset($result[0]['long']) && is_numeric($result[0]['long'])) {
return array(
'lat' => $result[0]['lat'],
'lon' => $result[0]['long'],
);
}
return NULL;
}
function location_map_link_us_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_us_yahoo_csz_get_field($location) . '&';
}
$get_query .= 'country=' . urlencode($location['country']);
return 'http://maps.yahoo.com/maps_result' . $get_query;
}
function location_map_link_us_google($location = array()) {
$query_params = array();
$q = NULL;
foreach (array(
'street',
'city',
'province',
'postal_code',
'country',
) as $field) {
if (isset($location[$field])) {
$query_params[] = $location[$field];
}
}
if (location_has_coordinates($location)) {
$q = urlencode($location['latitude'] . ' ' . $location['longitude'] . ' (' . implode(', ', $query_params) . ')');
}
else {
if (count($query_params) > 0) {
$q = urlencode(implode(", ", $query_params));
}
}
if ($q != NULL) {
return 'http://maps.google.com?q=' . $q;
}
else {
return NULL;
}
}
function location_map_link_us_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=US&' . $get_query;
}
else {
return NULL;
}
}
function location_map_link_us_providers() {
return array(
'google' => array(
'name' => 'Google Maps',
'url' => 'http://maps.google.com',
'tos' => 'http://www.google.com/help/terms_local.html',
),
'yahoo' => array(
'name' => 'Yahoo! Maps',
'url' => 'http://maps.yahoo.com',
'tos' => 'http://help.yahoo.com/help/us/maps/maps-24.html',
),
'mapquest' => array(
'name' => 'MapQuest',
'url' => 'http://www.mapquest.com',
'tos' => 'http://www.mapquest.com/features/main.adp?page=legal',
),
);
}
function location_map_link_us_default_providers() {
return array(
'google',
);
}
function location_geocode_us_providers() {
return array(
'yahoo' => array(
'name' => 'Yahoo! Maps Web Services',
'url' => 'http://developer.yahoo.com/maps/rest/V1/geocode.html',
'tos' => 'http://developer.yahoo.com/maps/mapsTerms.html',
),
);
}
function location_geocode_us_yahoo_settings() {
$form = array();
$form['location_geocode_us_yahoo_appid'] = array(
'#type' => 'textfield',
'#title' => t('Yahoo! Web Services Application ID'),
'#size' => 64,
'#maxlength' => 128,
'#default_value' => variable_get('location_geocode_us_yahoo_appid', 'YahooDemo'),
'#description' => t('Unless you are using this site to test and develop, you will need to obtain a Yahoo! Web Services Application ID from the %network_link. If you are using for development and testing purposes, you can use \'YahooDemo\' as your AppID. When getting an Application ID from Yahoo!, please also be sure to review the %usage_policy.', array(
'%network_link' => '<a href="http://api.search.yahoo.com/webservices/register_application">Yahoo! Developer Network</a>',
'%usage_policy' => '<a href="http://developer.yahoo.com/usagePolicy/index.html">usage policy</a>',
)),
);
return $form;
}
function location_geocode_us_yahoo($location = array()) {
$service_url = "http://api.local.yahoo.com/MapsService/V1/geocode?appid=" . variable_get('location_geocode_us_yahoo_appid', "YahooDemo") . "&location=";
$address = location_address2singleline($location);
$http_reply = drupal_http_request($service_url . urlencode($address));
if ($http_reply->code == 400) {
return NULL;
}
else {
$matches = array();
preg_match('/precision="([a-z]*)"/', $http_reply->data, $matches);
if ($matches[1] != 'address') {
return NULL;
}
else {
$lat_match = array();
$lon_match = array();
$latlon = array();
if (preg_match('/<Latitude>(.*)<\\/Latitude>/', $http_reply->data, $lat_match)) {
$latlon['lat'] = $lat_match[1];
}
else {
return NULL;
}
if (preg_match('/<Longitude>(.*)<\\/Longitude>/', $http_reply->data, $lon_match)) {
$latlon['lon'] = $lon_match[1];
return $latlon;
}
else {
return NULL;
}
}
}
}
function location_driving_directions_link_us($location_a, $location_b) {
return _location_driving_directions_link_us_yahoo($location_a, $location_b);
}
function _location_driving_directions_link_us_yahoo($location_a, $location_b) {
if (trim($location_b['country']) != 'ca' && trim($location_b['country']) != 'us') {
return '';
}
foreach ($location_a as $field => $value) {
$location_a[$field] = trim($value);
}
foreach ($location_b as $field => $value) {
$location_b[$field] = trim($value);
}
if (_location_us_enough_fields_for_yahoo($location_a) && _location_us_enough_fields_for_yahoo($location_b)) {
$yahoo_maps_path = 'dd_result';
}
else {
$yahoo_maps_path = 'dd';
}
$get_query = '?';
$get_query .= 'addr=' . urlencode($location_a['street']) . '&';
$get_query .= 'csz=' . _location_us_yahoo_csz_get_field($location_a) . '&';
$get_query .= 'country=' . urlencode($location_a['country']) . '&';
$get_query .= 'taddr=' . urlencode($location_b['street']) . '&';
$get_query .= 'tcsz=' . _location_us_yahoo_csz_get_field($location_b) . '&';
$get_query .= 'tcountry=' . urlencode($location_b['country']);
$get_query .= '&getrte=' . urlencode('Get Directions');
return 'http://maps.yahoo.com/' . $yahoo_maps_path . $get_query;
}
function _location_us_enough_fields_for_yahoo($location) {
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;
}
function _location_us_yahoo_csz_get_field($location) {
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['province'])) {
if (strlen($location['city'])) {
return urlencode($location['city']);
}
else {
return urlencode($location['province']);
}
}
return '';
}
function _location_us_geocoder_oneline($location = array()) {
$line = '';
$line .= $location['street'] . ', ';
if (strlen($location['city']) && strlen($location['province']) && strlen($location['postal_code'])) {
$line .= $location['city'] . ', ' . $location['province'] . ' ' . $location['postal_code'];
}
elseif (strlen($location['city']) && strlen($location['province'])) {
$line .= $location['city'] . ', ' . $location['province'];
}
elseif (strlen($location['postal_code'])) {
if (strlen($location['city']) || strlen($location['province'])) {
if (strlen($location['city'])) {
$line .= $location['city'] . ', ' . $location['postal_code'];
}
else {
$line .= $location['province'] . ', ' . $location['postal_code'];
}
}
else {
$line .= $location['postal_code'];
}
}
return $line;
}
function location_province_list_us() {
return array(
'AL' => 'Alabama',
'AK' => 'Alaska',
'AZ' => 'Arizona',
'AR' => 'Arkansas',
'CA' => 'California',
'CO' => 'Colorado',
'CT' => 'Connecticut',
'DE' => 'Delaware',
'DC' => 'District Of Columbia',
'FL' => 'Florida',
'GA' => 'Georgia',
'HI' => 'Hawaii',
'ID' => 'Idaho',
'IL' => 'Illinois',
'IN' => 'Indiana',
'IA' => 'Iowa',
'KS' => 'Kansas',
'KY' => 'Kentucky',
'LA' => 'Louisiana',
'ME' => 'Maine',
'MD' => 'Maryland',
'MA' => 'Massachusetts',
'MI' => 'Michigan',
'MN' => 'Minnesota',
'MS' => 'Mississippi',
'MO' => 'Missouri',
'MT' => 'Montana',
'NE' => 'Nebraska',
'NV' => 'Nevada',
'NH' => 'New Hampshire',
'NJ' => 'New Jersey',
'NM' => 'New Mexico',
'NY' => 'New York',
'NC' => 'North Carolina',
'ND' => 'North Dakota',
'OH' => 'Ohio',
'OK' => 'Oklahoma',
'OR' => 'Oregon',
'PA' => 'Pennsylvania',
'RI' => 'Rhode Island',
'SC' => 'South Carolina',
'SD' => 'South Dakota',
'TN' => 'Tennessee',
'TX' => 'Texas',
'UT' => 'Utah',
'VT' => 'Vermont',
'VA' => 'Virginia',
'WA' => 'Washington',
'WV' => 'West Virginia',
'WI' => 'Wisconsin',
'WY' => 'Wyoming',
'AS' => 'American Samoa',
'FM' => 'Federated States of Micronesia',
'GU' => 'Guam',
'MH' => 'Marshall Islands',
'MP' => 'Northern Mariana Islands',
'PW' => 'Palau',
'PR' => 'Puerto Rico',
'VI' => 'Virgin Islands',
);
}
function location_province_list_numeric_us() {
return array(
'001' => 'Alabama',
'002' => 'Alaska',
'003' => 'Arizona',
'004' => 'Arkansas',
'005' => 'California',
'006' => 'Colorado',
'007' => 'Connecticut',
'008' => 'Delaware',
'009' => 'District Of Columbia',
'010' => 'Florida',
'011' => 'Georgia',
'012' => 'Hawaii',
'013' => 'Idaho',
'014' => 'Illinois',
'015' => 'Indiana',
'016' => 'Iowa',
'017' => 'Kansas',
'018' => 'Kentucky',
'019' => 'Louisiana',
'020' => 'Maine',
'021' => 'Maryland',
'022' => 'Massachusetts',
'023' => 'Michigan',
'024' => 'Minnesota',
'025' => 'Mississippi',
'026' => 'Missouri',
'027' => 'Montana',
'028' => 'Nebraska',
'029' => 'Nevada',
'030' => 'New Hampshire',
'031' => 'New Jersey',
'032' => 'New Mexico',
'033' => 'New York',
'034' => 'North Carolina',
'035' => 'North Dakota',
'036' => 'Ohio',
'037' => 'Oklahoma',
'038' => 'Oregon',
'039' => 'Pennsylvania',
'040' => 'Rhode Island',
'041' => 'South Carolina',
'042' => 'South Dakota',
'043' => 'Tennessee',
'044' => 'Texas',
'045' => 'Utah',
'046' => 'Vermont',
'047' => 'Virginia',
'048' => 'Washington',
'049' => 'West Virginia',
'050' => 'Wisconsin',
'051' => 'Wyoming',
'052' => 'American Samoa',
'053' => 'Federated States of Micronesia',
'054' => 'Guam',
'055' => 'Marshall Islands',
'056' => 'Northern Mariana Islands',
'057' => 'Palau',
'058' => 'Puerto Rico',
'059' => 'Virgin Islands',
);
}
function location_bounds_us() {
return array(
'minlng' => -179.22745,
'minlat' => -56.5109,
'maxlng' => 158.80735,
'maxlat' => 71.399467,
);
}