Example #1
0
 /**
  *
  * @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;
 }
Example #2
0
$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>";
Example #3
0
        $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'];
Example #4
0
 /**
  * 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;
 }
Example #5
0
 /**
  * @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;
 }
Example #6
0
 /**
  * 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;
 }