32

近くの場所を取得する必要があるアプリケーションに取り組んでいます。Web サービスは 2 つのパラメーター (10 進経度、10 進緯度) を受け取ります。

経度と緯度のフィールドを持つデータベースに場所が保存されているテーブルがあります。

最寄りの場所を取得したい。

誰でも助けることができますか?

これが私のコードです:

 var locations = from l in locations

     select l

これについての詳細は次のとおりです。データベーステーブル内に2つのフィールド(decimal(18、2)null)1つの緯度、2つの経度があります。

そして私には方法があります

public List<Locations>  GetLocation(decimal? Long, decimal? lat) 
{
var Loc = from l in Locations
  //// now here is how to get nearest location ? how to query?
  //// i have also tried Math.Abs(l.Lat - lat) its giving error about nullable decimal always hence i have seted decimal to nullable or converted to nullable
 //// also i have tried where (l.lat - Lat) * (l.lon - Long)  this is also giving error about can not convert decimal to bool
return Loc.ToList();
}
4

6 に答える 6

58

最初にデータベース内の位置データを に変換してからSystem.Device.Location.GeoCoordinate、LINQ を使用して最も近いものを見つけることができます。

var coord = new GeoCoordinate(latitude, longitude);
var nearest = locations.Select(x => new GeoCoordinate(x.Latitude, x.Longitude))
                       .OrderBy(x => x.GetDistanceTo(coord))
                       .First();
于 2012-10-11T09:22:59.797 に答える
9

@Fung のコメントを詳しく説明すると、Entity Framework / LINQ to Entities を使用している場合GeoCoordinate.GetDistanceTo、LINQ クエリでメソッドを使用しようとすると、次のメッセージとともにランタイム NotSupportedException が発生します。

LINQ to Entities はメソッド 'Double GetDistanceTo(System.Device.Location.GeoCoordinate)' メソッドを認識せず、このメソッドはストア式に変換できません。

Entity Framework バージョン 5 または 6 では、代わりにSystem.Data.Spatial.DbGeographyクラスを使用できます。例えば:

DbGeography searchLocation = DbGeography.FromText(String.Format("POINT({0} {1})", longitude, latitude));

var nearbyLocations = 
    (from location in _context.Locations
     where  // (Additional filtering criteria here...)
     select new 
     {
         LocationID = location.ID,
         Address1 = location.Address1,
         City = location.City,
         State = location.State,
         Zip = location.Zip,
         Latitude = location.Latitude,
         Longitude = location.Longitude,
         Distance = searchLocation.Distance(
             DbGeography.FromText("POINT(" + location.Longitude + " " + location.Latitude + ")"))
     })
    .OrderBy(location => location.Distance)
    .ToList();

_contextこの例では、以前にインスタンス化された DbContext インスタンスです。

現在MSDN では文書化されていませんが、 DbGeography.Distanceメソッドによって返される単位はメートルのようです。参照: System.Data.Spatial DbGeography.Distance units?

于 2014-06-19T21:32:23.423 に答える
2

「ヒット」が実際には関係ない有効な範囲はありますか? その場合は、

from l in locations where ((l.lat - point.lat) * (l.lat - point.lat)) + ((l.lng - point.lng) * (l.lng - point.lng)) < (range * range) select l

次に、それらの結果のループ内で距離の二乗値が最小のヒットを見つけます。

于 2012-10-11T09:02:22.290 に答える