2

나는 도시 이름, 경도 및 위도가있는 7000 개 이상의 레코드가 포함 된 sqlite 데이터베이스가있는 응용 프로그램을 가지고 있습니다.이 "도시"도 데이터베이스의 관련 도시 필드에 연결되어 있습니다.CoreData + Magical Record 선택 쿼리 실행

내 앱이하는 일은 핵심 위치가있는 현재 위치를 쿼리하고 lon 및 lat 값을 가져온 다음 데이터베이스에서 가장 가까운 위치를 찾습니다.

결과는 (난 그냥 도시와 일치 할) 슈퍼 정확하지 않습니다, 그래서 가장 가까운 지점 찾기 위해 빗변의 공식을 사용하려면 : 나는 MS-SQL을 사용하는 경우

closest city in db: min((x1-x2)^2 +(y1-y2)^2)^(1/2) 

x1, y1: lon and lat for user 
x2, y2: lon and lat for points in database. 

을 또는 sqlite 데이터베이스를 사용하면 쉽게 쿼리를 만들 수 있지만 핵심 데이터에 관해서는 아이디어가 없습니다.

모든 데이터를 가져 와서 메모리를 채우고 싶지 않아 모든 수식에이 수식을 집계하지 않으므로 쿼리를 만들고 db에서 결과를 얻을 수있는 방법이 있습니까?

이 문제에 지나치게 신경 쓰지 않고 간단한 해결책이 누락 되었습니까?

답변

1

문제를 올바르게 이해하고 있다면 현재 위치에서 가장 가까운 "n"도시를 찾고 싶습니다.

나는 비슷한 것을 가지고 있으며 여기에 내가 어떻게 접근 했는가?

본질적으로 각 도시의 위도/경도를 가져 와서 일부 색인에 해싱해야합니다. 우리는 Mercator Projection을 사용하여 위도/경도를 x/y로 변환 한 다음 Google/Bing/Apple Maps가지도 타일을 해싱하는 방식과 비슷한 방식으로 해당 값을 해시합니다. 다행히도 MapKit에는 Mercator Projection 기능이 내장되어 있습니다.의사에서

:

for each city's lat/lon { 
    CLLocationCoordinate2D coordinate = (CLLocationCoordinate2D){lat, lon}; 
    MKMapPoint point = MKMapPointForCoordinate(coordinate); 
    //256 represents the size of a map tile at zoomLevel 20. You can use whatever zoomLevel 
    //you want here, but we need something to quickly lookup close-by cities. 
    //this is the formula you can use to determine how granular your index is 
    //(256 * pow(2, (20 - zoomLevel))) 
    NSInteger x = point.x/256.0; 
    NSInteger y = point.y/256.0; 
    save x & y in a CityHashIndex table 
} 

지금, 당신은 현재 위치의 위도/경도, 인덱스에 위와 같이하고, 단지이 CityHashIndex 테이블에 대해 쿼리를 작성 해시를 얻을.

간단히 말해서 현재 위치는 1000, 1000입니다. 따라서 도시에서 가까운 곳을 찾기 위해 '900-1100, 900-1100'범위의 인덱스가있는 도시를 검색 할 수 있습니다.

거기에서 이제는 훨씬 더 작은 도시 집합 만 가져오고 사기 법을 처리하기위한 메모리 요구 사항은 그렇게 나쁘지 않습니다.

관심이 있다면 더 자세히 설명 할 수 있습니다.

+0

이것은 꽤 흥미로운 것 같습니다. 글쎄, 단지 1 개의 도시를 찾고 싶습니다. "x/y 해싱"에 대해 자세히 설명해주세요. 왜 그 값들을 해쉬 할 필요가 있을까요? – dreampowder

+0

좋아, 내가 몇 가지 연구를했고 이것은 최고의 대답 인 것 같다. 나는이 coe를 시도하고 결과를 알려줄 것이다 :) – dreampowder

0

NSPredicate를 사용하여 검색 기준을 정의하면 필터 역할을합니다. 나는 이것이 얼마나 최적화되어 있는지 그리고 모든 레지스터를 가져올 지 확신하지 못한다. 그러나 coreData가 검색을 최적화 할 인덱싱 메커니즘을 가지고 있다고 가정하고있다.

당신은 특정 개체

+0

이미 많은 장소에서 nspredicate를 사용하고 있습니다. 제 질문은 위의 수식을 nspredicate에 통합하는 방법입니다. (가능한 경우) – dreampowder

1

이 직접 코어 데이터에 대한 자주 묻는 질문과 관련이 가져 오는

라는 섹션을 확인이 문서

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdFetching.html

의 모습이 걸릴 수 있습니다.

Searching for surrounding suburbs based on latitude & longitude using Objective C

는 당신이 필요로하는 점을 중심으로 경계 상자를 계산 (최소 위도 긴/최대 위도 긴 /) 다음 상자 내에서 모든 것을 찾아 그 가치를 상대로 자 NSPredicate를 사용합니다. 거기에서 리턴하고 정렬하는 결과에 대해 거리 계산을 수행 할 수 있습니다.

도시를 10 마일, 100 마일 이내로 볼 수있는 여러 거리를 검색 할 수 있도록 설정하는 것이 좋습니다. 하나 이상의 결과가 나올 때까지 천천히 경계 상자를 늘리십시오.