/lib/geo/geolib.php
https://gitlab.com/ElvisAns/tiki · PHP · 206 lines · 136 code · 27 blank · 43 comment · 24 complexity · cb8a9b1ef71c50348820a3857d6f9b24 MD5 · raw file
- <?php
- // (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
- //
- // All Rights Reserved. See copyright.txt for details and a complete list of authors.
- // Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
- // $Id$
- /**
- *
- */
- class GeoLib
- {
- /**
- * @param $type
- * @param $itemId
- * @return array
- */
- public function get_coordinates($type, $itemId)
- {
- $attributelib = TikiLib::lib('attribute');
- $attributes = $attributelib->get_attributes($type, $itemId);
- if (isset($attributes['tiki.geo.lat'], $attributes['tiki.geo.lon'])) {
- $coords = [
- 'lat' => $attributes['tiki.geo.lat'],
- 'lon' => $attributes['tiki.geo.lon'],
- ];
- if ($coords['lat'] == 0 && $coords['lon'] == 0) {
- return;
- }
- if (! empty($attributes['tiki.geo.google.zoom'])) {
- $coords['zoom'] = $attributes['tiki.geo.google.zoom'];
- }
- return $coords;
- }
- }
- /**
- * @param $type
- * @param $itemId
- * @return string
- */
- public function get_coordinates_string($type, $itemId)
- {
- if ($coords = $this->get_coordinates($type, $itemId)) {
- return $this->build_location_string($coords);
- }
- }
- /**
- * @param array $coords
- * @return string
- */
- public function build_location_string($coords)
- {
- $string = '';
- if (isset($coords['lat']) && isset($coords['lon'])) {
- $string = "{$coords['lon']},{$coords['lat']}";
- if (isset($coords['zoom'])) {
- $string .= ",{$coords['zoom']}";
- }
- }
- return $string;
- }
- /**
- * @param $type
- * @param $itemId
- * @param $coordinates
- */
- public function set_coordinates($type, $itemId, $coordinates)
- {
- if (is_string($coordinates)) {
- $coordinates = $this->parse_coordinates($coordinates);
- }
- if (isset($coordinates['lat'], $coordinates['lon'])) {
- $attributelib = TikiLib::lib('attribute');
- $attributelib->set_attribute($type, $itemId, 'tiki.geo.lat', $coordinates['lat']);
- $attributelib->set_attribute($type, $itemId, 'tiki.geo.lon', $coordinates['lon']);
- if (isset($coordinates['zoom'])) {
- $attributelib->set_attribute($type, $itemId, 'tiki.geo.google.zoom', $coordinates['zoom']);
- }
- }
- }
- /**
- * @param $string
- * @return array
- */
- public function parse_coordinates($string)
- {
- if (preg_match("/^(-?\d*(\.\d+)?),(-?\d*(\.\d+)?)(,(\d+))?$/", $string, $parts)) {
- $coords = [
- 'lat' => $parts[3],
- 'lon' => $parts[1],
- ];
- if (isset($parts[6])) {
- $coords['zoom'] = $parts[6];
- }
- return $coords;
- }
- }
- /**
- * @param $where
- * @return array|bool
- */
- public function geocode($where)
- {
- global $prefs;
- $url = 'https://maps.googleapis.com/maps/api/geocode/json?' . http_build_query(
- [
- 'address' => $where,
- 'sensor' => 'false',
- 'key' => $prefs['gmap_key'],
- ],
- '',
- '&'
- );
- $response = TikiLib::lib('tiki')->httprequest($url);
- $data = json_decode($response);
- if ($data->status !== 'OK') {
- return [
- 'error' => $data->error_message,
- 'status' => $data->status,
- ];
- }
- $first = reset($data->results);
- return [
- 'status' => 'OK',
- 'accuracy' => 500,
- 'label' => $first->formatted_address,
- 'lat' => $first->geometry->location->lat,
- 'lon' => $first->geometry->location->lng,
- 'address_components' => $first->address_components,
- ];
- }
- /**
- * @param $geo
- * @return array|bool
- */
- public function geofudge($geo)
- {
- if (! $geo) {
- return false;
- }
- if (empty($geo["lon"]) || empty($geo["lat"])) {
- return ["lon" => 0, "lat" => 0];
- }
- $geo["lon"] = $geo["lon"] + mt_rand(0, 10000) / 8000;
- $geo["lat"] = $geo["lat"] + mt_rand(0, 10000) / 10000;
- return $geo;
- }
- /**
- * @param $itemId
- * @param $geo
- */
- public function setTrackerGeo($itemId, $geo)
- {
- global $prefs;
- $trklib = TikiLib::lib('trk');
- $item = $trklib->get_tracker_item($itemId);
- $fields = $trklib->list_tracker_fields($item['trackerId']);
- foreach ($fields["data"] as $f) {
- if ($f["type"] == 'G' && $f["options_array"][0] == 'y') {
- $fieldId = $f["fieldId"];
- $options_array = $f["options_array"];
- $pointx = $geo['lon'];
- $pointy = $geo['lat'];
- $pointz = $prefs["gmap_defaultz"];
- break;
- }
- }
- if (isset($fieldId)) {
- $ins_fields["data"][$fieldId] = ['fieldId' => $fieldId, 'options_array' => $options_array, 'value' => "$pointx,$pointy,$pointz", 'type' => 'G'];
- $res = $trklib->replace_item($item['trackerId'], $itemId, $ins_fields);
- }
- }
- public function get_default_center()
- {
- global $prefs;
- $coords = $this->parse_coordinates($prefs['gmap_defaultx'] . ',' . $prefs['gmap_defaulty'] . ',' . $prefs['gmap_defaultz']);
- $center = ' data-geo-center="' . smarty_modifier_escape($this->build_location_string($coords)) . '" ';
- return $center;
- }
- }