X-Git-Url: https://dev.renevier.net/?p=syj.git;a=blobdiff_plain;f=application%2Fmodels%2FPath.php;h=6512f76d64bc21cd9a8b357558b1efe527fc4b41;hp=28e5c9021b2d614d4fc2dcd9ed187a7bd09590ee;hb=00c2579ade64a20ba2d82e98d3eea5f864864cdb;hpb=36a21a430d77f914b32eed29019f1f3cd5e9c3fa diff --git a/application/models/Path.php b/application/models/Path.php index 28e5c90..6512f76 100644 --- a/application/models/Path.php +++ b/application/models/Path.php @@ -83,4 +83,70 @@ class Syj_Model_Path extends Syj_Model_Generic return $this->_creator_ip; } + /* + * returns an array containing two arrays. First one is list of distance + * from start. Second on is altitude at that point. + * @error: ratio of void we accept + */ + public function getAltiProfile($altiService, $error = 0) { + $points = $altiService->interpolate($this->_geom); + $points = array_map(function($point) { + if ($point instanceof \gisconverter\Geometry) { + return array($point->lon, $point->lat); + } + return $point; + }, $points); + $altitudes = $altiService->altitude($points); + + if (is_null($altitudes)) { + throw new Syj_Exception_NotImplemented("could not compute altitude profile"); + } + + $res = array(array(0, $altitudes[0])); + $prevpoint = $points[0]; + $prevdist = 0; + + $alticount = count($altitudes); + $altinull = 0; + foreach (range(1, count($altitudes) - 1) as $idx) { + $point = $points[$idx]; + $delta = $altiService->vincentyDistance($prevpoint[0], $prevpoint[1], $point[0], $point[1]); + $dist = $prevdist + $delta; + if ($delta == 0) { // we have two similar points side to side + continue; + } + if (is_null($altitudes[$idx])) { + $altinull++; + continue; + } + $prevpoint = $point; + $prevdist = $dist; + $res[] = array($dist, $altitudes[$idx]); + } + + if ($altinull / $alticount > $error) { + throw new Syj_Exception_NotImplemented("too many void in altitude profile"); + } + return $res; + } + + public function getProfileCache($size) { + $cacheDir = Zend_Controller_Front::getInstance()->getParam('profileCache'); + if (is_file($cacheDir) and !is_dir($cacheDir)) { + throw new Zend_Exception(); + } + if (!is_dir($cacheDir)) { + if (@mkdir($cacheDir, 0755, true) === false) { + throw new Zend_Exception(); + } + } + + return sprintf("%s/%s-%s.png", $cacheDir, (string)$this->_id, $size); + } + + public function invalidateCache() { + @unlink($this->getProfileCache('small')); + @unlink($this->getProfileCache('big')); + } + }