2013-01-18 3 views
7

나는 데이터베이스가 있고 GPS 좌표로 클래스 호텔이 있습니다. 내가 선택한 좌표에 가장 가까운 장소를 얻고 싶습니다. 내가 뭔가를 같이해야한다고 생각C# - LINQ - GPS 위도와 경도로 최단 거리

은 (여기 많은 예제 코드를 발견하고 이와 같은) :

: 뭔가를 검색하려고 할 때

var coord = new GeoCoordinate(latitude, longitude); 
var nearest = (from h in db.hotels 
       let geo = new GeoCoordinate(h.gps.lat, h.gps.lng) 
       orderby geo.GetDistanceTo(coord) 
       select h).Take(10); 

문제는 내가이 오류를 가지고있다

만 매개 변수가없는 생성자와 초기화는

나는 그것에게 구글을 시도 엔티티에 LINQ 에서 지원됩니다 d 나는 그 linq를 2로 나누는 것이 나를 도울 수 있다는 것을 알았지 만, 나는 잘 모릅니다. 도와 주셔서 감사합니다. 그 방법의 구현을 제공 할 수있다,

var nearest = (from h in db.hotels 
      let geo = new GeoCoordinate{ Latitude = h.gps.lat, Longitude = h.gps.lng} 
      orderby geo.GetDistanceTo(coord) 
      select h).Take(10); 

하지만 당신은 가능성이 GetDistanceTo 방법에 의한 문제가 발생합니다 :

+0

*의 구현을 사용하여 성공에 대한 합리적인 있었다. 나는 그것이 많은 일들없이 일하지 않을 것이라고 생각합니다. 저장 프로 시저 또는 UDF가 필요할 수도 있습니다. –

답변

6

는 대신 매개 변수가있는 생성자의 개체 이니셜 라이저를 사용할 수 있습니까?

+0

그래, 네 말이 맞아. 당신은 매개 변수가없는 생성자로 내 문제를 해결했지만 그 방법에 문제가있다. 나는 그것을 impelementing 아니에요. GeoCoordinate 클래스에서 제공하는 메소드입니다. 내가 Linq에서 산술 연산을 할 수있는 곳이 거의 없다는 것을 알았을 때, 나는 그것을 사용해야하고 그것을위한 알고리즘을 발견했다. 맞습니까? –

+0

@Bibo 오, GeoCoordinate가 프레임 워크 클래스라는 것을 알지 못했습니다. Linq to Entities는 IQueryable 에서 ToList()를 호출하면 나중에 데이터베이스에 대해 실행되는 SQL 스크립트를 내부적으로 생성하므로 SQL 데이터 조작 언어에서 허용하는 몇 가지 작업으로 제한됩니다. – TKharaishvili

+0

@Bibo 다음 두 클래스가 유용 할 수 있습니다. http://msdn.microsoft.com/en-us/library/system.data.objects.entityfunctions.aspx http://msdn.microsoft.com/ en-us/library/system.data.objects.sqlclient.sqlfunctions.aspx – TKharaishvili

4

나는 여기에 내가 사용하고있는 나의 해결책을 게시한다. 그러나 나는 문제의 나의 문제를 해결하기 때문에 그윈 블 리드 대답을 택했다.

내 수업에 DbGeography 유형을 추가했으며 위도와 경도를 데이터베이스에 저장하는 대신 사용하고 있습니다.

locationField = DbGeography.FromText(String.Format("POINT({0} {1})", orig.gps.lat.ToString().Replace(",", "."), orig.gps.lng.ToString().Replace(",", "."))); 

는 그런 다음 LINQ를 사용하는 것은 매우 쉽습니다 : 지금이 작동 솔루션의

var coord = DbGeography.FromText(String.Format("POINT({0} {1})", latitude.ToString().Replace(",", "."), longitude.ToString().Replace(",", "."))); 
      var nearest = (from h in db.hotels 
          where h.location != null 
          orderby h.location.Distance(coord) 
          select h).Take(limit); 
      return nearest; 

을 그리고 그것은 좋다. 언젠가 나는 이것을 사용할 것입니다. 그러나 소수의 사용자가 여기서 말했듯이 아마도 호버린 수식을 구현하는 UDF를 시도 할 것입니다 (예 : this answer).

+0

+1 - DbGeography 클래스에 대한 포인터를 보내 주셔서 감사합니다! 그러나 : FromText 메서드의 경도 및 위도 인수의 순서가 반대로되어 있다고 생각합니다. 참조 : http://stackoverflow.com/questions/16546598/dbgeography-pointfromtext-throws-latitude-values-must-be- between-90-and-90-d –

3

나는 * 데이터베이스에 현재 연산을하려고 년대 Haversine Distance 공식

var startPoint = new { Latitude = 1.123, Longitude = 12.3 }; 

var closest = entities.Something.OrderBy(x => 12742 * SqlFunctions.Asin(SqlFunctions.SquareRoot(SqlFunctions.Sin(((SqlFunctions.Pi()/180) * (x.Latitude - startPoint.Latitude))/2) * SqlFunctions.Sin(((SqlFunctions.Pi()/180) * (x.Latitude - startPoint.Latitude))/2) + 
            SqlFunctions.Cos((SqlFunctions.Pi()/180) * startPoint.Latitude) * SqlFunctions.Cos((SqlFunctions.Pi()/180) * (x.Latitude)) * 
            SqlFunctions.Sin(((SqlFunctions.Pi()/180) * (x.Longitude - startPoint.Longitude))/2) * SqlFunctions.Sin(((SqlFunctions.Pi()/180) * (x.Longitude - startPoint.Longitude))/2)))).Take(5);