2015-01-19 2 views
0

지도에 원을 그려서 내 데이터베이스의 모든 행을 geo로 그 원에 속하는 위도/경도 점으로 가져옵니다.Google지도 서클/MySQL 검색어

나는 mercator 투영 왜곡을 적용하므로 google.maps.Circle을 사용하여 원을 그리는 것을 원하지 않습니다. 나는 지리적 서클이 아닌 기하학적 서클을 원한다.

그래서 저는 이것을 몇 가지 오버레이를 사용하여 Google지도에 그릴 수 있습니다. 하지만 내 데이터베이스에 이러한 포인트를 쿼리 할 수 ​​있습니까?

지형 서클을 그리려면 haversine formula을 사용할 수 있지만 기하학적 원에는 사용할 수 없습니다.

답변

1

피타고라스을 사용하여 원 내의 포인트를 찾을 수 있습니다. 필요한 경우

a^2 + b^2 = c^2 

다음 SQL은 원의 반지름

$stmt = $dbh->prepare("SELECT name, lat, lng, (SQRT(POW(? - lat, 2) 
         + POW(? - lng, 2))) AS distance FROM mytable 
         HAVING distance < ? ORDER BY distance ASC "); 
    // Assign parameters 
    $stmt->bindParam(1,$center_lat);//Center of circle 
    $stmt->bindParam(2,$center_lng);////Center of circle 
    $stmt->bindParam(3,$radius); 

자바 스크립트 함수 내에서 포인트를 찾기 위해 PDO를 사용

function Pythagoras (x1,y1,x2,y2){ 
    var Dist = Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)); 
return Dist ; 
} 
0

확인을보고 충분히 세그먼트 다각형을 사용하여 원을 그릴 수 있습니다 : 당신은 그냥 사용 "지리적으로 직사각형"영역에 대한 쿼리를 실행할 수 있습니다, MySQL 용으로

// lat, lng, and radius specify the circle 
 
// CosDeg, SinDeg are functions that accept input in degrees  
 
mPerDegLat = 110540, 
 
mPerDegLng = CosDeg(lat) * 111320; //-- mPerDegLng CORRECTED FOR LATITUDE 
 
numSegs = 64; 
 
deltaAng = 360/numSegs; 
 
verts = []; 
 
for (i=0; i<numSegs; i++) { 
 
    angle = i * deltaAng; 
 
    dy = CosDeg(angle) * radius; 
 
    dx = SinDeg(angle) * radius; 
 
    deltaLat = dy/mPerDegLat; //-- METRES PER DEGREE 
 
    deltaLng = dx/mPerDegLng; 
 
    vertex = {lat:(lat + deltaLat), lng:(lng + deltaLng)}; 
 
    verts.push(vertex); 
 
} 
 
polyCircle = new google.maps.Polygon({paths:verts, strokeColor...});

을 lat, lng 값을 채우기에 충분한 값을 설정하여 놓치지 않도록하고 역 계산을 수행하는 스크립트로 결과를 필터링하여 원 안에 있는지 확인하십시오.