1

場所のリストがあり、場所を入力し、指定した場所から半径 X マイル以内の場所をデータ グリッドに入力できるようにしたいと考えています。これを達成するためにC#のコードを書いた経験のある人はいますか?

データの緯度と経度があります。

どんな助けでも大歓迎です!ありがとう!

私はそれを考え出した!これはうまくいくようです。場所を入力すると、その緯度/経度が残りの 1300 フィールドと比較され、テーブルにデータが表示されます。コードを凝縮するための提案があれば、それは驚くべきことです!!

private void btnSubmit_Click(object sender, EventArgs e)
    {


        if (comboBox1.SelectedIndex != 0)
        {
            lblMsg.Text = "Please select Location no From DropDown for Radius search";
            return;
        }
        else
        {
            if (txtRadius.Text == "")
            {
                lblMsg.Text = "Please enter radius value";
                return;
            }

            double radius = Convert.ToDouble(txtRadius.Text);
            searchData = txtLocNo.Text;
            str = "Select latitude,longitude from details where locno='" + searchData + "'";
            con.Open();
            cmd = new OleDbCommand(str, con);
            dr = cmd.ExecuteReader();

            if (!dr.HasRows)
            {
                lblMsg.Text = "No Records Found";
                dataGridView1.Visible = false;
                con.Close();
                return;
            }
            else
            {
                dr.Read();
                double lat1 = dr.GetDouble(0);
                double lng1 = dr.GetDouble(1);
                double lat2, lng2,dist;
                String loc="";

                lblMsg.Text = lat1 + "  " + lng1;
                dr.Dispose();
                str = "Select locno,latitude,longitude from details";
                cmd = new OleDbCommand(str, con);
                dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    loc=dr.GetString(0);
                    lat2 = dr.GetDouble(1);
                    lng2 = dr.GetDouble(2);
                    dist=calculateDistance(lat1,lng1,lat2,lng2);

                    str = "Update details set distance=" + dist + " where locno='"+loc+"'";
                    cmd = new OleDbCommand(str, con);
                    cmd.ExecuteNonQuery();

                }

                str = "select * from details where distance<=" + radius;
                con.Close();
                lblResult.Text = "Radius Search Results";
                fillGrid();
            }


        }
    }

    private double calculateDistance(double lat1,double lng1,double lat2,double lng2)
    {
        double x= 69.1 * (lat2 - lat1); 
        double y = 69.1 * (lng2 - lng1) * Math.Cos(lat1 / 57.3);

        double dist = Math.Sqrt(x * x + y * y);
        dist = Math.Round(dist, 2);
        return dist;

    }

    private double calculateDistance1(double lat1, double lng1, double lat2, double lng2)
    {
        double theta = lng1 - lng2;
        double dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) +
            Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) *
            Math.Cos(deg2rad(theta));
        dist = Math.Acos(dist);
        dist = rad2deg(dist);
        dist = dist * 60 * 1.1515;
        dist = Math.Round(dist, 2);
        return dist;
    }

    private double deg2rad(double deg)
    {
        return (deg * Math.PI / 180.0);
    }

    private double rad2deg(double rad)
    {
        return (rad / Math.PI * 180.0);
    }

    private void txtRadius_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar != '0' && e.KeyChar != '1' && e.KeyChar != '2' && e.KeyChar != '3' &&
            e.KeyChar != '4' && e.KeyChar != '5' && e.KeyChar != '6' && e.KeyChar != '7' &&
            e.KeyChar != '8' && e.KeyChar != '9' && e.KeyChar != '.' && e.KeyChar!= Convert.ToChar(8))
        {
            e.Handled = true;
        }
4

3 に答える 3

0

以前にそのようなタスクがありましたが、SQL関数を使用して解決しました。これはあなたのシナリオではないかもしれませんが、興味のある人にとっては:

-- =============================================
-- Description: Return list of myTable within provided radius and location
-- =============================================
ALTER PROCEDURE [dbo].[proc_] 
    @lattitude DECIMAL(9, 6) = 0 ,
    @longitude DECIMAL(9, 6) = 0 ,
    @radius DECIMAL(18, 3) = 0
AS 
    BEGIN

        DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(@lattitude, @longitude, 4326)

        SELECT  *
        FROM    myTable a
        WHERE   @point.STDistance(GEOGRAPHY::Point(a.Lattitude, a.Longitude, 4326)) <= @radius *2

    END

myTable列には次が含まれます。

Lattitude   decimal
Longitude   decimal

注: SQL バージョンは 2008 以降です。

役立つリンク

この助けを願っています

于 2013-05-08T12:04:00.590 に答える