*! Source of lhaversine.mlib *! *! hav_dist.mata *! version 1.0.0, Lars Zeigermann, 21jul2025 version 10 mata: real matrix hav_dist(real colvector lat_from, real colvector lng_from, real colvector lat_to, real colvector lng_to, | real scalar radius) { real matrix LAT1 real matrix LNG1 real matrix LAT2 real matrix LNG2 real matrix DLAT real matrix DLNG real matrix COSLAT1 real matrix COSLAT2 real matrix SINDLAT real matrix SINDLAT_sq real matrix SINDLNG real matrix SINDLNG_sq real matrix DIST real scalar dr if (args() == 4) radius = 6371 LAT1 = J(1,rows(lat_to),lat_from) LNG1 = J(1,rows(lng_to),lng_from) LAT2 = J(rows(lat_from),1,lat_to') LNG2 = J(rows(lng_from),1,lng_to') dr = pi()/180 DLAT = (LAT2:-LAT1):*(dr:/2) DLNG = (LNG2:-LNG1):*(dr:/2) LAT1 = LAT1:*dr LAT2 = LAT2:*dr COSLAT1 = cos(LAT1) COSLAT2 = cos(LAT2) SINDLAT = sin(DLAT) SINDLAT_sq = SINDLAT:*SINDLAT SINDLNG = sin(DLNG) SINDLNG_sq = SINDLNG:*SINDLNG DIST = 2:*asin(sqrt(SINDLAT_sq:+COSLAT1:*COSLAT2:*SINDLNG_sq)):*radius return(DIST) } real matrix hav_distm(real colvector lat_from, real colvector lng_from, real colvector lat_to, real colvector lng_to, | real scalar radius) { if (args() == 4) radius = 3958.7559 return(hav_dist(lat_from,lng_from,lat_to,lng_to,radius)) } end *! *! hav_inrange.mata *! version 1.0.0, Lars Zeigermann, 21jul2025 version 10 mata: real matrix hav_inrange(real colvector lat_from, real colvector lng_from, real colvector lat_to, real colvector lng_to, real scalar range, | real scalar radius) { if (args() == 5) radius = 6371 return(hav_dist(lat_from,lng_from,lat_to,lng_to,radius) :<= range) } real matrix hav_inrangem(real colvector lat_from, real colvector lng_from, real colvector lat_to, real colvector lng_to, real scalar range, | real scalar radius) { if (args() == 5) radius = 3958.7559 return(hav_distm(lat_from,lng_from,lat_to,lng_to,radius) :<= range) } real matrix hav_ninrange(real colvector lat_from, real colvector lng_from, real colvector lat_to, real colvector lng_to, real scalar range, | real scalar radius) { if (args() == 5) radius = 6371 return(rowsum((hav_dist(lat_from,lng_from,lat_to,lng_to) :<= range))) } real matrix hav_ninrangem(real colvector lat_from, real colvector lng_from, real colvector lat_to, real colvector lng_to, real scalar range, | real scalar radius) { if (args() == 5) radius = 3958.7559 return(rowsum((hav_distm(lat_from,lng_from,lat_to,lng_to) :<= range))) } end