C#.NET

Enlem ve Boylam Koordinatlarının x ve y Pixel Dönüşümü ve Harita Ölçeklendirmesi

Selamün Aleyküm Arkadaşlar,

Koordinatları verilmiş bir çokgenin çizimi nasıl yapılır bunu inceleyeceğiz.

polygon

 

Çokgen Enlem ve Boylam

Index Boylam (Longitude) Enlem (Latitude)
0 -142.734375 -44.087585
1 -129.726563 -40.313043
2 -117.246094 -45.460131
3 -110.742188 -53.225768
4 -117.070313 -59.800634
5 -132.011719 -64.168107
6 -148.535156 -59.888937
7 -154.335938 -53.014783
8 -142.734375 -44.087585

 

Tablodan enlem ve boylam için maksimum ve minimum değerlerini bulalım.

Boylam max: -110.742188

Boylam min: -154.335938

Enlem max: -40.313043

Enlem min: -64.168107

cizim5

Bu enlem ve boylam değerlerinin x ve y koordinatlarına çevirmemiz gerekir. Bunun için Merkator Projeksiyonundan (Mercator Projection) yararlanırız. Bu projeksiyon bize dünyanın bir dikdörtgen olarak harita açılımını verir. İlk önce enlem ve boylam radyan cinsine çevrilir.

Enlem = Enlem * pi / 180
Boylam = Boylam * pi / 180

Enlem = ln(tan(pi/4 + Enlem/2))

x = Boylam
y = Enlem

C#

public PointF getlatlong2xy (double longitude, double latitude) {
          var radians = Math.PI / 180;
          longitude = longitude * radians;
          latitude = latitude * radians;

          return new PointF(Convert.ToSingle(longitude), Convert.ToSingle(Math.Log(Math.Tan(Math.PI / 4 + 0.5 * latitude))));
        }

Merkator Projeksiyonuna çevirdiğimiz zaman:

PointF min = getlatlong2xy(-154.335938, -64.168107);
PointF max = getlatlong2xy(-110.742188, -40.313043);

 

maxmin

Enlem ve boylamları x ve y koordinatlara çevirelim:

Index X Y
0 -2.49118471 -0.859029233
1 -2.26415563 -0.770058334
2 -2.04633045 -0.892776847
3 -1.93281579 -1.10139823
4 -2.04326248 -1.31001961
5 -2.30403924 -1.47262156
6 -2.59242749 -1.31308758
7 -2.69367027 -1.09526229
8  -2.49118471 -0.859029233

 

Çizim Alanımız:

cizim

Çizim alanımızla çokgenin boyutlarının oranını bulmamız gerekir. İlk önce çizim alanımızdan 10px lik boşluk bırakalım. Genişlikten sağ ve sol olmak üzere 10px boşluk bıraktığımızda genişlik = genişlik – 20. Aynı şekilde yükseklik = yükseklik – 20. Yeni çizim alanımız 562×353

Şimdi ise Çokgenin x ve y deki boyutunu bulalım.

Xboyut = Xmax – Xmin

Yboyut = Ymax – Xmin

cizim5

genislikoran = 562 / Xboyut

yukseklikoran = 353 / Yboyut

Hangi oran daha düşükse o oran bizim genel oranımız olur.

genislikoran = 738.6432

yukseklikoran = 502.4459

geneloran = 502.4459

Genişlik ve Yükseklik boşluklarını bulalım.

Yukseklikbosluk = (373 – (Yboyut * geneloran)) / 2

Genislikbosluk = (582 – (Xboyut * geneloran)) / 2


cizim1

X ve Y koordinatlarımızı çizim için başlangıç durumuna getirelim.

X = X – Xmin

Y = Y – Ymin

Index X – Xmin Y – Ymin
0 0.202485561 0.6135923
1 0.429514647 0.7025632/td>
2 0.6473398 0.5798447
3 0.7608545 0.37122333
4 0.6504078 0.162601948
5 0.389631033 0.0
6 0.101242781 0.159533978
7 0.0 0.377359271
8 0.202485561 0.6135923

 

X ve Y koordinatlarını çizim alanına göre ölçekleyelim.

X = Genislikbosluk + (X * geneloran)

Y koordinatı 0,0 dan başlayacağı için tersine çevirelim.

Y = 373 – Yukseklikbosluk – (Y * geneloran)

Index X Y
0 201.593933 54.703064
1 315.663757 10.0
2 425.109131 71.65941
3 482.1441 176.480362
4 426.6506 281.301331
5 295.62442 363.0
6 150.724915 282.8428
7 99.855896 173.397385
8 201.593933 54.703064

 

cizim5

C#

public PointF getlatlong2xy (double longitude, double latitude) {
          var radians = Math.PI / 180;
          longitude = longitude * radians;
          latitude = latitude * radians;

          return new PointF(Convert.ToSingle(longitude), Convert.ToSingle(Math.Log(Math.Tan(Math.PI / 4 + 0.5 * latitude))));
}

public Image getImage(PointF[] points, int width, int height, int padding = 10)
        {
            if (points.Length == 0)
                return null;

            Image img = new Bitmap(width, height);

            PointF min = new PointF(points[0].X, points[0].Y);
            PointF max = new PointF(points[0].X, points[0].Y);

            foreach (PointF p in points)
            {
                min.X = (p.X < min.X) ? p.X : min.X;
                min.Y = (p.Y < min.Y) ? p.Y : min.Y;

                max.X = (p.X > max.X) ? p.X : max.X;
                max.Y = (p.Y > max.Y) ? p.Y : max.Y;
            }

            min = getlatlong2xy(min.X, min.Y);
            max = getlatlong2xy(max.X, max.Y);

            PointF XYlength = new PointF(max.X - min.X, max.Y - min.Y);

            int mapWidth = img.Width - padding * 2;
            int mapHeight = img.Height - padding * 2;

            float widthRatio = mapWidth / XYlength.X;
            float heightRatio = mapHeight / XYlength.Y;

            float globalRatio = Math.Min(widthRatio, heightRatio);

            int widthPadding = Convert.ToInt32((width - (XYlength.X * globalRatio)) / 2);
            int heightPadding = Convert.ToInt32((height - (XYlength.Y * globalRatio)) / 2);

            List<PointF> dpoints = new List<PointF>();

            foreach (PointF p in points)
            {
                PointF p1 = getlatlong2xy(p.X, p.Y);
                p1.X -= min.X;
                p1.Y -= min.Y;

                float x = widthPadding + p1.X * globalRatio;
                float y = img.Height - heightPadding - (p1.Y * globalRatio);

                dpoints.Add(new PointF(x, y));
            }

            Graphics g = Graphics.FromImage(img);
            g.FillPolygon(Brushes.Blue, dpoints.ToArray(), System.Drawing.Drawing2D.FillMode.Alternate);

            return img;
        }

 

Hayırlı Günler. Sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.

C# using Kullanımı

Merhaba Arkadaşlar;

Uzun bir aradan sonra blogumda yazmaya başlıyorum. Bugün C# using kullanımına, nasıl kullanıldığına ve niçin kullanıldığına bir göz atalım.

C# ‘ta using kullanımı; using directive ve using statement olarak ikiye ayrılır.

USING DIRECTIVE (USING BİLDİRİMİ)

Namespace’leri dahil ettiğimiz ismini yazmadan içinde bulunan sınıfları (class) kullandığımız yapıdır. Namespace dışında en üstte şu şekilde tanımlanır: using namespaceadi;

using System;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Collections.Generic.List<int> list = new System.Collections.Generic.List<int>();
        }
    }
}

List sınıfı (class) System.Collections.Generic isim uzayının (namespace) içinde yer alır. using ile dahil etmediğimiz için namespace adını da yazarak çağırmak durumunda kaldık.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> list = new List<int>();
        }
    }
}

Burada ise System.Collections.Generic isim uzayını dahil ettiğimizden dolayı sadece içinde bulunan List sınıfını çağırarak kullandık.

Aynı zamanda using bildirimi ile dahil ettiğimiz namespace ve namespace içindeki sınıfları adlandırmak içinde kullanılır.

using System;
using Liste = System.Collections.Generic.List<int>;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            Liste list = new Liste();
        }
    }
}

Burada System.Collections.Generic.List<int> sınıfını Liste olarak adlandırdık ve bu yüzden o isimle kullandık.

USING STATEMENT (USING İFADESİ)

Bir sınıf kullanıldıktan sonra, çöp toplayıcından (Garbage Collector) önce; IDisposable arayüzünün (interface) Dispose metodunun çalıştırılarak hafızadan (memory) silinmesi işlemidir.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SqlConnection con = new SqlConnection()){
                //con kullan
            }
        }
    }
}

Kullanımı bu şekildedir. Sınıf {} içinde kullanılmalıdır.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection con = new SqlConnection(); //Bu kullanım tavsiye edilmez
            using (con){
                //con kullan
            }
        }
    }
}

Bu şekilde kullanımı tavsiye edilmez.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
//Birden fazla değişkenle kullanabilirsiniz
            using (SqlConnection con = new SqlConnection(), con2 = new SqlConnection()) { 
                //con ve con2 kullan
            }
        }
    }
}

Birden fazla değişkenle kullanabilirsiniz.

using ifadesi aslında şu kodun kısa halidir.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection con = new SqlConnection();

            try
            {
                //Kodlar
            }
            finally
            {
                if (con != null)
                    ((IDisposable)con).Dispose();
            }
        }
    }
}

Not: using ifadesinin kullanıldığı sınıflar IDisposable arayüzü (interface) içermek zorundadır.

Hayırlı Günler. Sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.

SingleTon Pattern Design (Tek Görüntülü Nesneler)

SingleTon bir nesnenin tek bir görüntüsünün (instance) oluşturulup public olarak kullanılmasıdır.

Örneğin bir db adında sınıfımız (class) olsun. Bunu program başında bir kere türetip kullanmamız performans bakımından yararlıdır.

Bunu statik (static) metodlarla yapabiliriz. Sınıfımızı tutabilmek için statik bir değişken tanımlayalım.

public class DB
{
    public static DB obje = null;
}

Şimdi de bir statik metod tanımlayalım. Geriye nesnenin görüntüsü (instance) oluşmuşsa nesneyi, oluşmamışsa oluşturup nesneyi gönderelim.

    public class DB
    {
        public static DB obje = null;

        public static DB getObje() 
        {
            if (obje == null)
                return obje = new DB();

            return obje;
        }
    }

Bunun testini göstermek içinde yapıcı (construct) bir metod yazalım. Rasgele bir sayı üretip değişkende tutalım.

    public class DB
    {
        public static DB obje = null;

        public int rndSayi = 0;

        public static DB getObje() 
        {
            if (obje == null)
                return obje = new DB();

            return obje;
        }

        public DB() {
            Random rnd = new Random();
            rndSayi = rnd.Next();
        }
    }

Şimdi de iki ayrı değişkende nesnenin tek bir kere görüntüsünün oluştuğunu test edelim. Normal olarak görüntüsünü alalım.

        static void Main(string[] args)
        {
            DB nesne1 = new DB();

            //Rastgele ikinci sayının farklı olması için 100 ms bekle
            Thread.Sleep(100);

            DB nesne2 = new DB();

            Console.WriteLine(nesne1.rndSayi);
            Console.WriteLine(nesne2.rndSayi);

            Console.ReadKey();
        }

Farklı iki sayı üretilecektir.

Şimdi de tek görüntüsünü alalım.

        static void Main(string[] args)
        {
            DB nesne1 = DB.getObje();

            //Rastgele ikinci sayının farklı olması için 100 ms bekle
            Thread.Sleep(100);

            DB nesne2 = DB.getObje();

            Console.WriteLine(nesne1.rndSayi);
            Console.WriteLine(nesne2.rndSayi);

            Console.ReadKey();
        }

Üretilen sayı aynı olacaktır. Çünkü nesnenin bir kere görüntüsü oluşacaktır.

Projeyi Buradan İndirebilirsiniz.

 

Hayırlı Günler. Sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.

ASP.NET – C# Stored Procedure Çağırmak

Selamün Aleyküm Arkadaşlar;

Ogrenciler tablosu olsun iki tane prosedur yazılmış olsun. OgrenciEkle, OgrenciListele. Biri öğrenci eklemek için diğeri öğrenci listelemek için. Alanları da no, ad, soyad olsun.

İlk önce Sql serverla işlemlerimizi yapmamızı sağlayan kütüphanemizi tanımlıyoruz.

using System.Data.SqlClient;

Bağlantımızı oluşturuyoruz.

SqlConnection con=new SqlConnection(constr);

Bağlantımızı açıyoruz.

con.Open();

Veritabanına sorgumuzu göndermek için SqlCommand nesnesini tanımlıyoruz.

SqlCommand cmd = New SqlCommand();

Hangi bağlantıyla bağlanacağını, sorgunun türünün ne olacağını ve hangi sorguyu çalıştıracağını tanımlıyoruz.

cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText="OgrenciEkle";

3 tane parametresi var. no int, ad nvarchar(50), soyad nvarchar(50) Üç tane Textbox nesnemiz olsun. Verileri oradan alalım.

cmd.Parameters.Add("no", SqlDbType.Int).Value = txtNo.Text;
cmd.Parameters.Add("ad", SqlDbType.NVarChar,50).Value = txtAd.Text;
cmd.Parameters.Add("soyad", SqlDbType.NVarChar,50).Value = txtSoyad.Text;

Geriye veri döndürmeyeceği için ExecuteNonQuery metoduyla veriyi çalıştırıyorum ve bağlantıyı kapatıyorum.

cmd.ExecuteNonQuery();
con.Close();

Şimdi ikinci prosedürümüzü çağıralım. İkinci prosedürümüz geriye değer döndürüyor. O yüzden SqlDataAdapter nesnesini tanımlayacağız. Dönen değeri DataGridView de gösterelim.

SqlConnection con = New SqlConnection(constr);
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText="OgrenciListele";
//Parametre almayacak
SqlDataAdapter da = New SqlDataAdapter(cmd);
//Datatable nesnemizi tanımlıyoruz.
DataTable dt = New DataTable();
da.Fill(dt) //DataTable nesnemizi dönen değerlerle dolduruyoruz.
DataGridView1.DataSource = dt; //Datagridview nesnesini dolduruyoruz.
DataGridView1.DataBind();

Not: CommandType kullanabilmek için System.Data kütüphanesini çağırmanız gerekir.

using System.Data;

 

Hayırlı günler. Sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.

C# SQL Server Bağlantı

Selamün Aleyküm Arkadaşlar,

İlk önce SglClient isim uzayını (namespace) projemize dahil ediyoruz.

using System.Data.SqlClient;

Baglanti adında bir class tanımlayalım. Sql bağlantımızı tanımlayalım.

public class baglanti{
   private SqlConnection con;
}

Sunucu, veritabani, kullanici ve parola değişkenlerini tanımlayalım.

public class baglanti{
   private SqlConnection con;

   private string _sunucu;
   private string _veritabani;
   private string _kullanici;
   private string _parola;
}

Bu değişkenlere private (özel) olduğu için dışarıdan erişilemez. Bu değişkenlere erişmek için özellik tanımlayalım.

public class baglanti{
        private SqlConnection con;

        private string _sunucu;

        public string Sunucu
        {
            get { return _sunucu; }
            set { _sunucu = value; }
        }
        private string _veritabani;

        public string Veritabani
        {
            get { return _veritabani; }
            set { _veritabani = value; }
        }
        private string _kullanici;

        public string Kullanici
        {
            get { return _kullanici; }
            set { _kullanici = value; }
        }
        private string _parola;

        public string Parola
        {
            get { return _parola; }
            set { _parola = value; }
        }
}

Özelliklerimizi tanımladık. bu girilen verilerle bağlantımızı oluşturalım. Bunun için bir BaglantiOlustur adında bir method yazalım. ConnectionString oluşturmak için SqlConnectionStringBuilder nesnesini kullanalım.

        public void BaglantiOlustur()
        {
            SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder();
            scsb.DataSource = _sunucu;
            scsb.InitialCatalog = _veritabani;
            scsb.UserID = _kullanici;
            scsb.Password = _parola;
            con = new SqlConnection(scsb.ConnectionString);
        }

Bağlantımızı tanımladık. Bağlantımızı Açıp, kapatmak için bir method yazalım.

        public void BaglantiAc()
        {
            if (con.State == ConnectionState.Closed)
                con.Open();
        }

        public void BaglantiKapat()
        {
            if (con.State == ConnectionState.Open)
                con.Close();
        }

ConnectionState kullanabilmek için projemize System.Data eklememiz gerekir.

Şimdi Update, Insert, Delete işlemini yaptıran bir method yazalım. Bu işlemi yapmak için SqlCommand nesnesini tanımlıyoruz. Bağlantımızı veriyoruz. Bağlantımızı açıyoruz. Sorgumuzu çalıştırıyoruz ve baglantımızı kapatıyoruz.

        public void SorguCalistir(string sorgu)
        {
            SqlCommand cmd = new SqlCommand(sorgu, con);
            BaglantiAc();
            cmd.ExecuteNonQuery();
            BaglantiKapat();
        }

Şimdi verileri datatable ile geriye döndüren bir fonksiyon yazalım. datatable veya dataseti doldurabilmek için SqlDataAdapter nesnesini kullanacağız.

        public DataTable TabloGetir(string sorgu)
        {
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(sorgu, con);
            da.Fill(dt);
            return dt;
        }

Şimdi de verilerimizi satır satır okumak için bir fonksiyon yazalım. Satırları okumamız için SqlDataReader nesnesini kullanacağız.

        public SqlDataReader VeriGetir(string sorgu)
        {
            SqlDataReader dr;
            SqlCommand cmd = new SqlCommand(sorgu, con);
            dr = cmd.ExecuteReader();
            return dr;
        }

Şimdilik sınıfımızı (class) bitirelim.

Şimdi nasıl kullanacağımıza bir bakalım. İlk önce bir sınıfımızın bir görüntüsünü (instance) oluşturalım. Sonra baglantı metnimizi tanımlayalım.

baglanti bag = new baglanti();
bag.Sunucu = "Sunucu adı";
bag.Veritabani = "Veritabanı";
bag.Kullanici = "Kullanıcı adı";
bag.Parola = "Parola";
bag.BaglantiOlustur();

SorguCalistir methodunun kullanımı

bag.SorguCalistir("Insert, Update, Delete sorgusu");

DatagridView nesnesine veri aktarımı

dataGridView1.DataSource= bag.TabloGetir("Select sorgusu");

Verileri satır satır okumak

bag.BaglantiAc();
SqlDataReader dr = bag.VeriGetir("Select sorgusu");
while (dr.Read())
{
    //dr["alanadi" / index].ToString();
}
bag.BaglantiKapat();

Hayırlı günler. Sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.