/** * * @param Array $coordinates Contains latitude and longitude values * @return Array containing geocoded information */ function reverse_geocode($coordinates, $options = array()) { $results = array(); $parameters = array('radius' => 10, 'maxRows' => 20, 'style' => 'FULL'); if (!empty($options)) { foreach ($options as $key => $value) { if (isset($parameters[$key])) { $parameters[$key] = $value; } } } if (!isset($coordinates['latitude']) && !isset($coordinates['longitude'])) { $this->error = 'POSITIONING_MISSING_ATTRIBUTES'; return null; } $params = array(); $params[] = 'lat=' . urlencode($coordinates['latitude']); $params[] = 'lng=' . urlencode($coordinates['longitude']); foreach ($parameters as $key => $value) { if (!is_null($value)) { $params[] = "{$key}=" . urlencode($value); } } $http_request = new org_openpsa_httplib(); $url = 'http://ws.geonames.org/findNearbyPlaceName?' . implode('&', $params); $response = $http_request->get($url); $simplexml = simplexml_load_string($response); if (!isset($simplexml->geoname) || count($simplexml->geoname) == 0) { $this->error = 'POSITIONING_DETAILS_NOT_FOUND'; if (isset($simplexml->status)) { $constant_name = strtoupper(str_replace(" ", "_", $simplexml->status)); $this->error = $constant_name; } return null; } for ($i = 0; $i < $parameters['maxRows']; $i++) { if (!isset($simplexml->geoname[$i])) { break; } $entry = $simplexml->geoname[$i]; $entry_coordinates = array('latitude' => (double) $entry->lat, 'longitude' => (double) $entry->lng); $meters = round(org_routamc_positioning_utils::get_distance($coordinates, $entry_coordinates) * 1000); $entry_meters = round((double) $entry->distance * 1000); if ($entry_meters < $meters) { $meters = $entry_meters; } $position = array(); $position['latitude'] = (double) $entry->lat; $position['longitude'] = (double) $entry->lng; $position['distance'] = array('meters' => $meters, 'bearing' => org_routamc_positioning_utils::get_bearing($coordinates, $entry_coordinates)); $position['city'] = (string) $entry->name; $position['region'] = (string) $entry->adminName2; $position['country'] = (string) $entry->countryCode; $position['postalcode'] = (string) $entry->postalcode; $position['alternate_names'] = (string) $entry->alternateNames; $position['accuracy'] = ORG_ROUTAMC_POSITIONING_ACCURACY_GPS; $results[] = $position; } return $results; }
$user = midcom::get('auth')->user->get_storage(); $user_position = new org_routamc_positioning_person($user); $coordinates = $user_position->get_coordinates(); if (!$coordinates) { throw new midcom_error("Failed to get your current position."); } echo "<p>" . sprintf('Your position is %s', org_routamc_positioning_utils::pretty_print_coordinates($coordinates['latitude'], $coordinates['longitude'])) . "</p>\n"; $run_times = 1; $run = 0; $total_time = 0; while ($run < $run_times) { $run++; $start = microtime(); $closest = org_routamc_positioning_utils::get_closest('org_routamc_positioning_city_dba', $coordinates, 10); echo "<p>Closest places to you are:<br />"; echo "<ol>\n"; foreach ($closest as $city) { $city_coordinates = array('latitude' => $city->latitude, 'longitude' => $city->longitude); echo "<li>{$city->city}, {$city->country} is " . round(org_routamc_positioning_utils::get_distance($coordinates, $city_coordinates)) . " kilometers " . org_routamc_positioning_utils::get_bearing($coordinates, $city_coordinates) . " from you</li>"; } echo "</ol>\n"; $end = microtime(); $end_parts = explode(' ', $end); $end = $end_parts[1] + $end_parts[0]; $start_parts = explode(' ', $start); $start = $start_parts[1] + $start_parts[0]; $time_used = $end - $start; $total_time = $time_used + $total_time; } $average = $total_time / $run_times; echo "<p>Query took {$total_time} seconds (on average {$average} seconds per query).</p>";
$manual_position['country'] = trim($params[1]); $manual_position['person'] = $person->id; $import = $manual->import($manual_position); if (!$import) { // Send error message to user org_routamc_positioning_send_sms($person->handphone, "Failed to store position, reason {$manual->error}", $config->get('smslib_from'), $config); } else { // Get current coordinates $user_position = new org_routamc_positioning_person($person); $latest_log = $user_position->seek_log(); $latest_coord = array('latitude' => $latest_log->latitude, 'longitude' => $latest_log->longitude); $previous_log = $latest_log->get_previous(); $message = "New location is " . org_routamc_positioning_utils::pretty_print_coordinates($latest_log->latitude, $latest_log->longitude) . "."; if ($previous_log) { $previous_coord = array('latitude' => $previous_log->latitude, 'longitude' => $previous_log->longitude); $message .= " Previous was " . org_routamc_positioning_utils::get_distance($previous_coord, $latest_coord) . "km " . org_routamc_positioning_utils::get_bearing($latest_coord, $previous_coord) . "."; } org_routamc_positioning_send_sms($person->handphone, $message, $config->get('smslib_from'), $config); } } midcom::get('auth')->drop_sudo(); midcom::get()->finish(); _midcom_stop_request(); } midcom::get('auth')->require_valid_user(); $user = midcom::get('auth')->user->get_storage(); if (array_key_exists('add_position', $_POST)) { $manual = org_routamc_positioning_importer::create('manual'); $manual_position = array(); if (array_key_exists('geocoder', $_POST)) { $manual_position['geocoder'] = $_POST['geocoder'];
/** * Pretty print a position mapping Microformatted city name or other label * * @return string */ function microformat_location($latitude, $longitude) { $coordinates = array('latitude' => $latitude, 'longitude' => $longitude); $closest = org_routamc_positioning_utils::get_closest('org_routamc_positioning_city_dba', $coordinates, 1); $latitude_string = org_routamc_positioning_utils::pretty_print_coordinate($latitude); $latitude_string .= $latitude > 0 ? " N" : " S"; $longitude_string = org_routamc_positioning_utils::pretty_print_coordinate($longitude); $longitude_string .= $longitude > 0 ? " E" : " W"; if (count($closest) == 0) { // No city found, generate only geo microformat $coordinates_string = "<span class=\"geo\">"; $coordinates_string .= "<abbr class=\"latitude\" title=\"{$latitude}\">{$latitude_string}</abbr> "; $coordinates_string .= "<abbr class=\"longitude\" title=\"{$longitude}\">{$longitude_string}</abbr>"; $coordinates_string .= "</span>"; return $coordinates_string; } foreach ($closest as $city) { // City found, combine it and geo $city_string = "<span class=\"geo adr\">"; $city_string .= "<abbr class=\"latitude\" title=\"{$latitude}\">{$latitude_string}</abbr> "; $city_string .= "<abbr class=\"longitude\" title=\"{$longitude}\">{$longitude_string}</abbr> "; $city_coordinates = array('latitude' => $city->latitude, 'longitude' => $city->longitude); $city_distance = round(org_routamc_positioning_utils::get_distance($coordinates, $city_coordinates)); $city_label = "<span class=\"locality\">{$city->city}</span>, "; $city_label .= "<span class=\"country-name\">{$city->country}</span>"; if ($city_distance <= 4) { $city_string .= $city_label; } else { $bearing = org_routamc_positioning_utils::get_bearing($city_coordinates, $coordinates); $city_string .= sprintf(midcom::get('i18n')->get_string('%skm %s of %s', 'org.routamc.positioning'), $city_distance, $bearing, $city_label); } $city_string .= "</span>"; } return $city_string; }
/** * @param Array $coordinates Contains latitude and longitude values * @param Array $options * @return Array containing geocoded information */ function reverse_geocode($coordinates, $options = array()) { $results = array(); $parameters = array('maxRows' => 1); if (!empty($options)) { foreach ($options as $key => $value) { if (isset($parameters[$key])) { $parameters[$key] = $value; } } } if (!isset($coordinates['latitude']) && !isset($coordinates['longitude'])) { $this->error = 'POSITIONING_MISSING_ATTRIBUTES'; return null; } $closest = org_routamc_positioning_utils::get_closest('org_routamc_positioning_city_dba', $coordinates, $parameters['maxRows']); if (empty($closest)) { $this->error = 'POSITIONING_DETAILS_NOT_FOUND'; return null; } foreach ($closest as $city) { $city_coordinates = array('latitude' => $city->latitude, 'longitude' => $city->longitude); $position = array(); $position['latitude'] = $city->latitude; $position['longitude'] = $city->longitude; $position['distance'] = array('meters' => round(org_routamc_positioning_utils::get_distance($coordinates, $city_coordinates) * 1000), 'bearing' => org_routamc_positioning_utils::get_bearing($coordinates, $city_coordinates)); $position['city'] = $city->city; $position['region'] = $city->region; $position['country'] = $city->country; $position['alternate_names'] = $city->alternatenames; $position['accuracy'] = ORG_ROUTAMC_POSITIONING_ACCURACY_GPS; $results[] = $position; } return $results; }
/** * Pretty print a position mapping Microformatted city name or other label * * @return string */ static function microformat_location(org_routamc_positioning_spot $spot) { $closest = org_routamc_positioning_utils::get_closest('org_routamc_positioning_city', $spot, 1); $latitude_string = org_routamc_positioning_utils::pretty_print_coordinate($spot->latitude); $latitude_string .= $spot->latitude > 0 ? ' N' : ' S'; $longitude_string = org_routamc_positioning_utils::pretty_print_coordinate($spot->longitude); $longitude_string .= $spot->longitude > 0 ? ' E' : ' W'; if (count($closest) == 0) { // No city found, generate only geo microformat $coordinates_string = "<span class=\"geo\">"; $coordinates_string .= "<abbr class=\"latitude\" title=\"{$spot->latitude}\">{$latitude_string}</abbr> "; $coordinates_string .= "<abbr class=\"longitude\" title=\"{$spot->longitude}\">{$longitude_string}</abbr>"; $coordinates_string .= "</span>"; return $coordinates_string; } foreach ($closest as $city) { // City found, combine it and geo $city_string = "<span class=\"geo adr\">"; $city_string .= "<abbr class=\"latitude\" title=\"{$spot->latitude}\">{$latitude_string}</abbr> "; $city_string .= "<abbr class=\"longitude\" title=\"{$spot->longitude}\">{$longitude_string}</abbr> "; $city_spot = new org_routamc_positioning_spot($city); $city_distance = round(org_routamc_positioning_utils::get_distance($spot, $city_spot)); $city_label = "<span class=\"locality\">{$city->city}</span>, "; $city_label .= "<span class=\"country-name\">{$city->country}</span>"; if ($city_distance <= 4) { $city_string .= $city_label; } else { $bearing = org_routamc_positioning_utils::get_bearing($city_spot, $spot); $city_string .= sprintf($_MIDCOM->i18n->get_string('%skm %s of %s', 'org_routamc_positioning'), $city_distance, $bearing, $city_label); } $city_string .= "</span>"; } return $city_string; }