]> dev.renevier.net Git - syj.git/blobdiff - application/models/Path.php
routes profile
[syj.git] / application / models / Path.php
index 28e5c9021b2d614d4fc2dcd9ed187a7bd09590ee..6512f76d64bc21cd9a8b357558b1efe527fc4b41 100644 (file)
@@ -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'));
+    }
+
 }