;;;; geopoint-utils.scm -*- Scheme -*- ;;;; Kon Lovett, Jul '18 ;;;; Kon Lovett, Aug '17 ;;;; Kon Lovett, May '17 (module geopoint-utils (;export ; in-closed-polygon? intersects? ; pythagorean-distance pythagorean-distance* spherical-surface-distance great-circle-distance great-circle-distance-radians straight-line-distance approximate-ellipsoid-distance ; great-circle-azimuth great-circle-position ;DEPRECATED geopoint-in-closed-polygon?) (import scheme (chicken base) (chicken type) geopoint geopolygon (prefix geo-utils gu:)) (include-relative "geo-utils.types") (define-type point-line-intersects? (real real real real real real --> boolean)) (: in-closed-polygon? (geopoint geopolygon #!optional point-line-intersects? --> boolean)) (: intersects? (geopoint geopoint geopoint --> boolean)) (: pythagorean-distance (geopoint geopoint --> real)) (: pythagorean-distance* (geopoint geopoint --> real)) (: spherical-surface-distance (geopoint geopoint #!optional real --> real)) (: great-circle-distance (geopoint geopoint #!optional real --> real)) (: great-circle-distance-radians (geopoint geopoint #!optional real --> real)) (: straight-line-distance (geopoint real geopoint real #!optional real --> real)) (: approximate-ellipsoid-distance (geopoint geopoint #!optional real real --> real)) (: great-circle-azimuth (geopoint geopoint #!optional real --> real)) (: great-circle-position (geopoint real real #!optional real --> real real)) ;; ;https://github.com/substack/point-in-polygon ; (define (in-closed-polygon? gp gpoly #!optional (xline? gu:intersects?-pip)) ;test for intersection of ray with every segment of the polygon ;start with the "closing" segment, then every [i-i],[i] segment (let ((len (vector-length (check-geopolygon 'in-closed-polygon? gpoly))) (lat (geopoint-latitude gp)) (lon (geopoint-longitude gp)) ) ;assumes an open-poly is "closed" so a closed-poly must be treated as "open" (let ((len (if (geopolygon-closed? gpoly) (- len 1) len))) (let loop ((i (the fixnum 0)) (j (- len 1)) (poly? #f)) (if (= i len) poly? (let ((new-poly (if (let ((pi (vector-ref gpoly i)) (pj (vector-ref gpoly j))) (xline? (geopoint-latitude pi) (geopoint-longitude pi) (geopoint-latitude pj) (geopoint-longitude pj) lat lon)) (not poly?) poly?)) ) (loop (+ i 1) i new-poly) ) ) ) ) ) ) (define (intersects? pt pi pj) (gu:intersects?-pip (geopoint-latitude pi) (geopoint-longitude pi) (geopoint-latitude pj) (geopoint-longitude pj) (geopoint-latitude pt) (geopoint-longitude pt)) ) ;; (define (pythagorean-distance p1 p2) (gu:pythagorean-distance (geopoint-latitude p1) (geopoint-longitude p1) (geopoint-latitude p2) (geopoint-longitude p2)) ) (define (pythagorean-distance* p1 p2) (gu:pythagorean-distance* (geopoint-latitude p1) (geopoint-longitude p1) (geopoint-latitude p2) (geopoint-longitude p2)) ) (define (spherical-surface-distance p1 p2 . opts) (apply gu:spherical-surface-distance (geopoint-latitude p1) (geopoint-longitude p1) (geopoint-latitude p2) (geopoint-longitude p2) opts) ) (define (great-circle-distance p1 p2 . opts) (apply gu:great-circle-distance (geopoint-latitude p1) (geopoint-longitude p1) (geopoint-latitude p2) (geopoint-longitude p2) opts) ) (define (great-circle-distance-radians p1 p2 . opts) (apply gu:great-circle-distance-radians (geopoint-latitude p1) (geopoint-longitude p1) (geopoint-latitude p2) (geopoint-longitude p2) opts) ) (define (straight-line-distance p1 h1 p2 h2 . opts) (apply gu:straight-line-distance (geopoint-latitude p1) (geopoint-longitude p1) h1 (geopoint-latitude p2) (geopoint-longitude p2) h2 opts) ) (define (approximate-ellipsoid-distance p1 p2 . opts) (apply gu:approximate-ellipsoid-distance (geopoint-latitude p1) (geopoint-longitude p1) (geopoint-latitude p2) (geopoint-longitude p2) opts) ) (define (great-circle-azimuth p1 p2 . opts) (apply gu:great-circle-azimuth (geopoint-latitude p1) (geopoint-longitude p1) (geopoint-latitude p2) (geopoint-longitude p2) opts) ) (define (great-circle-position p dis azi . opts) (apply gu:great-circle-position (geopoint-latitude p) (geopoint-longitude p) dis azi opts) ) ;; (: geopoint-in-closed-polygon? (deprecated in-closed-polygon?)) (define geopoint-in-closed-polygon? in-closed-polygon?) ) ;module geopoint-utils