2012-05-03 2 views
0

저는 이탈리아에 많은 레스토랑 데이터베이스 (> 100000)를 만들고 싶습니다. 근처에 "기능. 나는 모든 레스토랑의 위도와 경도를 포함하는 테이블을 만들고 싶습니다. mysql 공간을 사용하려고 생각했습니다.mysql : mysql 공간을 사용하여 많은 POI의 위도와 경도를 저장하고 거리를 계산합니다.

내 주변의 모든 레스토랑을 찾으려면 검색어를 만들 수 있습니까 (내 좌표는 GPS로 찍습니다), 반경 10km입니까?

나는 거리를 벗어나려고 노력하고 있지만 주변을 인터넷 검색하는 것은 흥미로운 것을 찾지 못했습니다.

당신은 mysql 공간을 사용하는 것이 좋은 생각이라고 생각합니까? 대신 float를 사용할 수 있습니까? 이 경우 10km 반경 내 주변의 모든 레스토랑을 찾기 위해 쿼리를 어떻게 만들 수 있습니까?

덕분에 많은

답변

1

MySQL 공간의 MBRIntersects 또는 MBRContains 기능은 익숙해 져야 할 것 같습니다.

this question 님의 답변이 시작되었습니다.

gis.stackexchange.com을 사용하면 MySQL 공간에 대한보다 나은 답변을 얻을 수 있습니다.

+0

힌트를 보내 주셔서 감사합니다. 시도해 볼게 – satboy78

-2

예, 당신은 지리 공간 기능을 사용할 수 있습니다 -하지만 오히려 복잡. 위도와 경도 (그리고 경도와 위도)를 기반으로 항목을 색인화하는 것이 훨씬 더 간단합니다. 데이터를 쿼리하는 경우 실제로 10km 이내에있는 레코드를 쿼리하는 대신 인덱스를 사용할 수있는 현재 위치를 중심으로 20km X 20km 경계 상자와 일치하는 행을 찾는 쿼리를 실행하는 것이 좋습니다. 예를 들어, 쿼리의 반경 외부의 사람들을 버립니다.

SELECT * FROM (
    SELECT p.id, p.description, 
    SQRT((x.current_latitiude-p.latitude)*(x.current_latitiude-p.latitude) 
     + (x.current_longitude-p.longitude)*(x.current_longitude-p.longitude)) 
     AS distance 
    FROM places p 
    WHERE p.latitude BETWEEN (x.current_latitiude - x.max_range) 
    AND (x.current_latitiude + x.max_range) 
    AND p.longitude BETWEEN (x.current_longitiude - x.max_range) 
    AND (x.current_longitiude - x.max_range) 
) ilv 
WHERE ilv.distance<x.max_range 

(당신은 위도/경도를 위해 사용하고있는 단위로 10km를 변환 x.max_range에 대한 값을 subsitute가해야합니다).

+0

감사합니다. 나는 20 x 20 km를 사용해야하는 이유를 이해할 수 없다 : 나를 설명해 주시겠습니까? – satboy78

+0

서쪽 10km + 동쪽 10km = 20km 스팬 – symcbean

+3

위도와 경도는 직선이 아닌 각도 값입니다. Pythogoras hypotenuse 계산에 직접 사용하면 매우 이상한 숫자가됩니다. 오히려 지구가 일정한 반지름을 가진 구체라고 가정 한 대략적인 거리에 대한 수식을 사용하십시오. (여기서는 http://stackoverflow.com/questions/1006654/fastest-distance-lookup-given-latitude-longitude) 그것은 아닙니다). – acraig5075

관련 문제