haversinus pasted by saeftl on Thu Jan 26 12:49:14 2012
(define *pi* 3.14159265358979323846) (define (->radians gps) (list (* (/ *pi* 180) (car gps)) (* (/ *pi* 180) (cadr gps)))) (define (gdist l1 l2) (let* ((min1 (->radians l1)) (min2 (->radians l2)) (dlat (- (car min1) (car min2))) (dlon (- (cadr min1) (cadr min2))) (haver (+ (sq (sin (/ dlat 2))) (* (cos (car min1)) (cos (car min2)) (sq (sin (/ dlon 2))))))) (* 6371 2 (asin (sqrt haver)))))
extract from osm databases added by saeftl on Thu Jan 26 17:40:17 2012
#! /usr/bin/perl $innode=0; $aplace=0; $gotname=0; while (<STDIN>) { if (m,^\s*<node\s+.*\s*lat="([0-9.]+)"\s+.*\s*lon="([0-9.]+)".*[^/]>\s*$,) { $innode = 1; $lat=$1; $lon=$2; } if (m,</node>,) { if ($innode && $aplace && $gotname ) { print "($name\t($lon, $lat))\n"; } $innode = $aplace = $gotname = 0; } if (m,<tag\s+[^>]*\s*k="place",) { if (m,<tag\s+[^>]*\s+v="(city|town|farm|village|isolated_dwelling|suburb|hamlet)",) { $aplace = 1; } } if (m,<tag\s+[^>]*\s*k="name",) { if (m,<tag\s[^>]*\sv="([^"]+)",) { $name = $1; $gotname=1; } } }