2013-06-07 4 views
1

질문이 SQL Server 자체와 100 % 관련이 없으면 죄송합니다. 하지만 여기에 게시 할 수있는 주제와 충분히 일치한다고 생각했습니다.DbGeography MULTIPOINT에서 경계 상자를 가져 오는 방법은 무엇입니까?

ASP.NET 웹 API 프로젝트에서 Entity Framework를 사용하고 있습니다. 내 POCO를 만드는 동안 브라우저 클라이언트 (Google Maps API)에서 LatLngBounds를받습니다.

직사각형을 다시 만들기 위해 두 점을 나타내는 이러한 수신 좌표에서 DbGeography (MULTIPOINT) 인스턴스를 만듭니다.

이제이 MULTIPOINT 구조체의 경계 상자 (다각형)가 필요합니다. 몇 가지 연구를 한 후 SqlGeometry 어셈블리의 STEnvelope 함수가 DbGeography 형식을 사용하여이 작업을 수행 할 수 없으므로이 작업에 도움이 될 것이라고 생각했습니다. 객체를 저장하려고 할 때까지 코드에서 모든 것이 잘 보입니다.

예를 들어 this gist을 참조하십시오. EF의 오류 메시지를 코드화하십시오. EF에서 생성 된 SQL에 대해서는 this gist을 참조하십시오.

이 방법으로 시도하는 것이 의미가 있습니까? 아니면 여기에 중요한 것을 놓친 것이고 훨씬 쉬운 방법이 있습니까?

답변

-1

제작되었습니다. 그러나 이것이 합병증없이 진행되는 길인지 확실하지 않습니다. 그러나 적어도 객체를 포함하는 것은 어쩌면 다른 사람이 더 나은 솔루션을 제공 할 수있는 오픈 질문을 떠나

poi.Shape = DbGeography.FromText(envelop.ToString()); 

poi.Shape = DbGeography.FromGml(envelop.AsGml().Value); 

을 변경하여 사용할 수 있습니다.

0
public static Tuple<double, double, double, double> GetEnvelopeFromPolygon(DbGeography polygon) 
    { 
     if (polygon == null) 
     { 
      return new Tuple<double, double, double, double>(0, 0, 0, 0); 
     } 

     var points = polygon.GetPointsFromPolygon(); 
     double minLat = double.MaxValue; 
     double maxLat = double.MinValue; 
     double minLon = double.MaxValue; 
     double maxLon = double.MinValue; 

     foreach (Tuple<double, double> point in points) 
     { 
      double lat = point.Item1; 
      double lon = point.Item2; 
      if (lat < minLat) 
      { 
       minLat = lat; 
      } 
      if (lat > maxLat) 
      { 
       maxLat = lat; 
      } 
      if (lon < minLon) 
      { 
       minLon = lon; 
      } 
      if (lon > maxLon) 
      { 
       maxLon = lon; 
      } 

     } 

     var res = new Tuple<double, double, double, double>(minLat, maxLat, minLon, maxLon); 
     return res; 
    } 


    public static IEnumerable<Tuple<double, double>> GetPointsFromPolygon(this System.Data.Entity.Spatial.DbGeography geo) 
    { 
     for (int i = 1; i < geo.PointCount; i++) 
     { 
      var p = geo.PointAt(i); 
      yield return new Tuple<double, double>(p.Latitude.Value, p.Longitude.Value); 
     } 

     var pFinal = geo.PointAt(1); 
     yield return new Tuple<double, double>(pFinal.Latitude.Value, pFinal.Longitude.Value); 
    } 
관련 문제