【地圖功能開發系列:一】根據當前座標點獲取距離不超過N公里的門店

在此處輸入標題

聲明變量

//假設當前座標
double lon1 = 113.336028;
double lat1 = 23.21745;
//距離m
 double distance = 1000 * 5;
private static  double EARTH_RADIUS = 6378137;//赤道半徑(單位m)

主要方法[LantitudeLongitudeDist]

public static double LantitudeLongitudeDist(double lon1, double lat1, double lon2, double lat2)
    {
        double radLat1 = rad(lat1);
        double radLat2 = rad(lat2);

        double radLon1 = rad(lon1);
        double radLon2 = rad(lon2);

        if (radLat1 < 0)
            radLat1 = Math.PI / 2 + Math.Abs(radLat1);// south  
        if (radLat1 > 0)
            radLat1 = Math.PI / 2 - Math.Abs(radLat1);// north  
        if (radLon1 < 0)
            radLon1 = Math.PI * 2 - Math.Abs(radLon1);// west  
        if (radLat2 < 0)
            radLat2 = Math.PI / 2 + Math.Abs(radLat2);// south  
        if (radLat2 > 0)
            radLat2 = Math.PI / 2 - Math.Abs(radLat2);// north  
        if (radLon2 < 0)
            radLon2 = Math.PI * 2 - Math.Abs(radLon2);// west  
        double x1 = EARTH_RADIUS * Math.Cos(radLon1) * Math.Sin(radLat1);
        double y1 = EARTH_RADIUS * Math.Sin(radLon1) * Math.Sin(radLat1);
        double z1 = EARTH_RADIUS * Math.Cos(radLat1);

        double x2 = EARTH_RADIUS * Math.Cos(radLon2) * Math.Sin(radLat2);
        double y2 = EARTH_RADIUS * Math.Sin(radLon2) * Math.Sin(radLat2);
        double z2 = EARTH_RADIUS * Math.Cos(radLat2);

        double d = Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + (z1 - z2) * (z1 - z2));
        //餘弦定理求夾角  
        double theta = Math.Acos((EARTH_RADIUS * EARTH_RADIUS + EARTH_RADIUS * EARTH_RADIUS - d * d) / (2 * EARTH_RADIUS * EARTH_RADIUS));
        double dist = theta * EARTH_RADIUS;
        return dist;
    }

遍歷判斷,得到符合條件的門店

 //準備存儲符合條件門店的泛型類
  List<ShopPlaceInfo> placelist = new List<ShopPlaceInfo>();
        //查詢數據庫的門店地址座標
        DataTable PlaceDt = kis_web.DBHelper.GetTable("select shopName, shopadress, Lat as lat,Lng as lon from Shop where Lat is not null and   Lng is not null");
        foreach (DataRow item in PlaceDt.Rows)
        {
            double currLon = Convert.ToDouble(item["lon"]);
            double currLat = Convert.ToDouble(item["lat"]);
            double place = LantitudeLongitudeDist(lon1, lat1, currLon, currLat);
            //如果當前距離和該門店距離相差小於指定N公里
            if (place <= distance)
            {
                //放進符合條件門店的泛型類中
                placelist.Add(new ShopPlaceInfo()
                {
                    lat = currLat,
                    lon = currLon,
                    saleQty = 1,
                    saleAmount = 100,
                    distance = place,
                    shopName = item["shopName"].ToString()

                });
            }
        }
       //這樣最終得到了符合條件的門店Json數據
       string reJson = JsonConvert.SerializeObject(placelist);

參考文章地址
該參考地址裏面的文章是用Java寫的,我這裏使用的這個方法轉成了C#的
這是一個小系列,還有後續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章