|
Kategoriler |
Bilgisayar Mühendisleri
SON YORUMLAR
|
Bilgisayar Mühendisleri
Here is the website inspired me to use
it as a guide when I tried to define
myself as an engineer candidate a few
years ago. It really helped me to work
and study feeling in confidence with
being on the right way. I suggest this
website to whom it may direct her/his
to find the right career path. It
includes many articles varies from
real life experiences to detailed
software engineering issues. But the
most dignified parts for me are the
articles in general and career titles.
|
Bilgisayar Mühendisleri Portalı
ASP.NET ile GIS Uygulamaları
|
|
Hemen hemen tüm uygulamalarda yer alan GIS ( Coğrafi Bilgi Sistemleri ) , zaman içerisinde isteklere bağlı olarak gittikçe gelişmektedir . Kullanılacağı alana göre Windows , Web ve Mobil uygulamalarına rahatlıkla yer almaktadır . Bu yazımda sizlere ASP.NET 2.0 ile nasıl Web tabanlı Coğrafi Bilgi Sistemi uygulaması geliştirebileceğinizi aktarıyor olacağım .
Yazıma başlamadan önce sizlere GIS hakkında biraz bilgi vermek istiyorum . GIS : Coğrafi bilgilerin bir araya getirilmesi , bu bilgilerin bilgisayara aktarılması , depo edilmesi , işlenmesi , daha sonrada analiz edilip sunulması amacı ile geliştirilmiş olan bir sistemdir . Bu sistem sahip olduğu etkin veritabanlarına ve yapılarına göre iki grupta değerlendirilir . Vektör Tabanlı ve Raster Tabanlı .Vektör tabanlı GIS`erde vektör olarak tanımlanan veri, herhangi bir koordinat sisteminde nokta, çizgi ve alanlardan oluşan veridir. Raster tabanlı GIS'lerde raster olarak tanımlanan veri, belirli sayısal, harf veya renk olarak değerleri olan hücrelerin (piksel) bir araya gelmesiyle oluşan görsel bilgiyi kapsamaktadır. Bu bilgileri de sizlerle paylaştıktan sonra uygulamamıza başlayabiliriz .
|
|
|
|
Uygulamamız da , harita oluşturma ve oluşturacağımız harita üzerinde işlemler yapabilmemize olanak sağlayan fonksiyonları barındıran sharpmap.dll`ini ve sistemimizde kullanacağımız harita katmanlarında göstermek istediğimiz şekil dosyalarını (shapefiles) uygulamamıza ekledikten sonra ilk olarak harita oluşturma fonksiyonunu düzenleyeceğiz. Sharpmap dll`ini makalemin sonunda belirteceğim referans adresinden temin edebilirsiniz yada benimle iletişime geçebilirsiniz .
|
|
|
private void haritaOlustur()
{
//harita bilgilerini veriyoruz
System.Drawing.Image img = harita.GetMap();
string imgID = SharpMap.Web.Caching.InsertIntoCache(1, img);
imgHarita.ImageUrl = "getmap.aspx?ID=" + HttpUtility.UrlEncode(imgID);
} |
|
|
haritaOlustur fonksiyonu sayesinde oluşturduğumuz img nesnesini GetMap fonksiyonu ile eşleştirip ara yüzümüze eklemiş olduğumuz imgHarita nesnesinin üzerine haritamızı oluşturduk . Bu fonksiyondan sonra haritamızın üzerinde bulunacak olan katmanları bu katmanlarda nelerin gösterileceğini ve ayarlarını yapabileceğimiz fonksiyonu düzenleyeceğiz.
|
|
private SharpMap.Map haritaDuzenle(System.Drawing.Size haritaBuyuklugu)
{
SharpMap.Map yeniHarita = new SharpMap.Map(haritaBuyuklugu);
SharpMap.Layers.VectorLayer katmanUlkeler = new SharpMap.Layers.VectorLayer("Ulkeler");
katmanUlkeler.DataSource = new SharpMap.Providers.ShapeFile(Server.MapPath(@"~\App_Data\ulkeler.shp"));
katmanUlkeler.Style.Fill = new SolidBrush(Color.YellowGreen);
katmanUlkeler.Style.Outline = System.Drawing.Pens.Black;
katmanUlkeler.Style.EnableOutline = true;
SharpMap.Layers.VectorLayer katmanNehirler = new SharpMap.Layers.VectorLayer("Nehirler");
katmanNehirler.DataSource = new SharpMap.Providers.ShapeFile(Server.MapPath(@"~\App_Data\nehirler.shp"));
katmanNehirler.Style.Line = new Pen(Color.Blue, 1);
yeniHarita.Layers.Add(katmanUlkeler);
yeniHarita.Layers.Add(katmanNehirler);
return yeniHarita;
} |
|
|
haritaDuzenle fonksiyonu içerisinde imgHarita nesnesinin büyüklüğüne göre yeni bir harita oluşturduktan sonra sırası ile Ülkeler ve Nehirler için yeni katmanlar meydana getirdik . Bu katmanlarda bulunacak olan dosyaları SharpMap.Providers.ShapeFile ile belirledikten sonra bu katmanlara özel çizgi , dolgu renkleri belirleyerek özelleştirmeler yaptık . Ve tüm bu ayarlamaları gerçekleştirdikten sonra bu katmanları oluşturmuş olduğumuz haritamıza Layers.Add ile ekleme işlemini tamamladık . Şimdide sıra sayfamız açılırken hazırlamış olduğumuz bu fonksiyonları çağımaya geldi .
|
|
SharpMap.Map harita;
protected void Page_Load(object sender, EventArgs e)
{
harita = haritaDuzenle(new System.Drawing.Size((int)imgHarita.Width.Value, (int)imgHarita.Height.Value));
//Haritamızın ilk görünümü
harita.ZoomToExtents();
haritaOlustur();
} |
|
|
Sayfamız başlatılırken hazır fonksiyonlarımızı da çağırdıktan sonra , Web.Config dosyamızın içerisini de aşağıda belirteceğim kodlar ile değiştirdikten sonra haritamızı ekranda görüntüleyebileceğiz .
|
|
<?xml version="1.0"?>
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="GetMap.aspx" type="SharpMap.Web.HttpHandler,SharpMap"/>
</httpHandlers>
<compilation debug="true"/>
</system.web>
</configuration> |
|
|
Evet adım adım tüm işlemleri tamamladıktan sonra haritamızı ilk kez ekranımızda görüntüleyebildik . Bu tür uygulamalarda temel teşkil eden bölümleri bitirdikten sonra isterseniz uygulamamızı pozitif ve negatif yönlerde zum (zoom) yapabilen , hareket (pan) yeteneğine sahip bir hale getirelim . Bu işlem işleri bir listesini oluşturmak için önce uygulamamıza bir adet RadioButtonList ekleyelim eğer daha önceden ara yüzümüzde İmage nesnesi kullanmış iseniz bunun yerine ImageButton ekleyelim . Bu değişikliği ImageButton nesnesinin tıklama olayından (click event ) yararlanmak için gerçekleştirdik .Bu değişiklikleri yaptıktan sonra aşağıda belirteceğim değişiklikleri uygulayacağız .
|
|
protected void Page_Load(object sender, EventArgs e)
{
harita = haritaDuzenle(new System.Drawing.Size((int)imgHarita.Width.Value, (int)imgHarita.Height.Value));
if (Page.IsPostBack)
{
//Geri gönderim var ise merkez ve zum değerlerini kaydet
harita.Center = (SharpMap.Geometries.Point)ViewState["haritaMerkez"];
harita.Zoom = (double)ViewState["haritaZum"];
}
else
{
//İlk zum ve merkez bilgilerini kaydet , ilk kez haritayı oluştur
harita.ZoomToExtents();
ViewState.Add("haritaMerkez", harita.Center);
ViewState.Add("haritaZum", harita.Zoom);
haritaOlustur();
}
} |
|
|
Kod bloğundaki bu değişiklik sayesinde eğer sayfamızda bir geri gönderim ( post back ) var ise sadece zum ve merkez bilgileri kaydediliyor eğer sayfamız ilk kez açılıyor ise haritayı bu işlemlerin yanı sıra haritamızı da oluşturacak olan fonksiyonun çağrımını gerçekleştiriyor . Bu değişikliği de tamamladıktan sonra Tıklama olayında yapacağımız işlemleri tanımlayalım . |
|
protected void imgHarita_Click(object sender, ImageClickEventArgs e)
{
//Kullanıcının tıkladığı noktayı saptayıp , bu noktayı haritamızın merkez noktası olarak belirliyoruz
harita.Center = SharpMap.Utilities.Transform.MapToWorld(new System.Drawing.Point(e.X, e.Y), harita);
//İşlem seçeneklerinden zum ile ilgili işaretleme varmı varsa değerine göre haritamıza zum uygulaması yapıyoruz
if (rdlSecenek.SelectedValue == "0")
//Zum +
harita.Zoom = harita.Zoom * 0.3;
else if (rdlSecenek.SelectedValue == "1")
//Zum -
harita.Zoom = harita.Zoom * 1.2;
//Bu hali ile Zum ve merkez bilgilerini kaydediyoruz
ViewState.Add("haritaMerkez", harita.Center);
ViewState.Add("haritaZum", harita.Zoom);
haritaOlustur();
} |
|
|
Zum işlemlerinde sıfır ile bir arasındaki değerlerde (+) yönde bir zum gerçekleştiriliyor ve değer sıfıra yaklaştıkça zum değeri daha fazla artıyor .
|
|
|
|
Şimdiye kadar ki bölümde basit bir harita uygulamasının nasıl oluşturulabileceğini ve üzerinde yapabileceğimiz en yaygın işlemlerden bazılarını sizlerle paylaşmaya çalıştım . Bu yazımızın devamında da sizlerle bu tür uygulamalarda gerçekleştirilebilecek birkaç uygulamayı da sizlerle paylaşmaya çalışacağım . Tekrar görüşmek üzere .
|
İlk olarak haritamız üzerinde istediğimiz bir noktaya nasıl bir nokta yada bir resim ile belirleyebiliriz . Bu ve bundan sonra vereceğim örneklerde haritamızı oluşturmuş olduğumuzu göz önünde bulundurarak mevcut sistemimiz üzerine eklemeler yaparak devam edeceğim .
|
|
|
// sistem üzerinde ekleme yapacağımız noktaları bu değişkene aktaracağız
static SharpMap.Geometries.GeometryCollection kol = new SharpMap.Geometries.GeometryCollection(); //
protected void imgHarita_Click(object sender, ImageClickEventArgs e)
{
SharpMap.Geometries.Point belirlenenNokta = new SharpMap.Geometries.Point(29, 37.7);
//burada istersek fare ile işaretlenen noktayıda aldırabiliriz
kol.Collection.Add(belirlenenNokta);
SharpMap.Geometries.LineString yeni = new SharpMap.Geometries.LineString();
SharpMap.Layers.VectorLayer katmanBel = new SharpMap.Layers.VectorLayer("KatmanBelirlenen");
katmanBel.DataSource = new SharpMap.Data.Providers.GeometryProvider(belirlenenNokta);
katmanBel.Style.Symbol = new Bitmap(@"D:\gisUygulama\App_Data\ikon.png");
harita.Layers.Add(katmanBel);
haritaOlustur();
} |
|
|
|
Yukarıdaki kod blok`u sayesinde haritamız üzerinde bir yeri ikon.png resmi ile aşağıdaki resimde gördüğümüz şekli ile işaretlemiş olduk . |
|
|
|
Eğer birden fazla noktayı aynı anda belirlemek istiyor iseniz ilk örneğimizdeki kodu aşağıdaki gibi değiştirmeliyiz .
|
|
SharpMap.Geometries.Point belirlenenNokta = new SharpMap.Geometries.Point(29, 37.7);
SharpMap.Geometries.Point belirlenenNokta1 = new SharpMap.Geometries.Point(30, 39);
//burada istersek fare ile işaretlenen noktayıda aldırabiliriz
kol.Collection.Add(belirlenenNokta);
kol.Collection.Add(belirlenenNokta1);
if (kol.Collection.Count < 2)
{
SharpMap.Geometries.LineString yeni = new SharpMap.Geometries.LineString();
SharpMap.Layers.VectorLayer katmanBel = new SharpMap.Layers.VectorLayer("KatmanBelirlenen");
katmanBel.DataSource = new SharpMap.Data.Providers.GeometryProvider(belirlenenNokta);
katmanBel.Style.Symbol = new Bitmap(@"D:\tahir\sharpmap2\App_Data\icon.png");
harita.Layers.Add(katmanBel);
haritaOlustur();
}
else
{
for (int i = 0; i < kol.Collection.Count; i++)
{
kol.Collection.Add(belirlenenNokta);
}
SharpMap.Layers.VectorLayer katmanBel = new SharpMap.Layers.VectorLayer("KatmanBelirlenen");
katmanBel.DataSource = new SharpMap.Data.Providers.GeometryProvider(kol);
katmanBel.Style.Symbol = new System.Drawing.Bitmap(@"D:\tahir\sharpmap2\App_Data\icon.png");
harita.Layers.Add(katmanBel);
haritaOlustur();
} |
|
|
Vermiş olduğumuz noktaları bir işaretçi yardımı ile belirledikten sonra , şimdide belirleyeceğimiz iki nokta arasında nasıl bir yol çizdirebiliriz . Bunun için sayfama tetikleyici olarak bir adat buton ekledikten sonra , bu botunun tıklanma olayına aşağıdaki kodu ekleyelim .
|
|
protected void btnCiz_Click(object sender, EventArgs e)
{
SharpMap.Geometries.LineString yeniCizgi = new SharpMap.Geometries.LineString();
//yolumuzun geçeceği noktaları yeniCizgi ye ekliyoruz
yeniCizgi.Vertices.Add(new SharpMap.Geometries.Point(29, 37.7));
yeniCizgi.Vertices.Add(new SharpMap.Geometries.Point(30, 39));
SharpMap.Layers.VectorLayer katmanVek = new SharpMap.Layers.VectorLayer("katmanVektör");
katmanVek.DataSource = new SharpMap.Data.Providers.GeometryProvider(yeniCizgi);
//Oluşturacağımız yolun özelliklerini belirliyoruz
katmanVek.Style.Line = new Pen(Color.Red, 2);
katmanVek.SRID = 4326;
harita.Layers.Add(katmanVek);
haritaOlustur();
}
|
|
|
Ve uygulamamıza bu kodu ekledikten sonra çalıştırdığımızda aşağıdaki gibi bir görünüm elde etmiş oluyoruz . Burada bir sıkıntı yaşamış olabiliriz buda , yolu çizdirdikten sonra eğer haritamızı yakınlaştırır isek yol kaybolacaktır çünkü her yakınlaştırmada yol haritaOlustur(); fonksiyonu ile yeniden oluşturulmaktadır . Bunu da sizlerle paylaşacak olduğum 3. örnekte belirlemiş olduğumuz bir alanı yakınlaştırma ile çözüyor olacağız . Tabi sadece tek çözüm de bu değil .
|
|
|
|
Bu yazımda sizlerle paylaşacak olduğum son örnek ise belirlemiş olduğumuz bir alanı ekrana yaklaştırma örneği olacak . Bu örneğimizde yakınlaştırmak istediğimiz alan için kuzey-güney ve doğu batı sınırlarını belirlememiz yeterli oluyor . |
|
protected void btnCiz_Click(object sender, EventArgs e)
{
//Yakınlaştırmak istediğimiz alanın koordinatlarını belirliyoruz
SharpMap.Geometries.BoundingBox yakinAlan = new SharpMap.Geometries.BoundingBox(new SharpMap.Geometries.Point(26, 36), new SharpMap.Geometries.Point(42, 45));
harita.ZoomToBox(yakinAlan);
haritaOlustur();
} |
|
|
Bu yazımda sizlerle paylaşacak olduğum son örnek ise belirlemiş olduğumuz bir alanı ekrana yaklaştırma örneği olacak . Bu örneğimizde yakınlaştırmak istediğimiz alan için kuzey-güney ve doğu batı sınırlarını belirlememiz yeterli oluyor .
|
|
Eğer 2. ve 3. örneklerimizdeki kodları birleştirir isek , 2. örnekte yaşamış olduğumuz problemi çözmüş oluruz .
Bu ve bir önceki yazımda ASP:NET ile GIS uygulamaları üzerine sizlere temelden başlayarak bu tür uygulamalar nasıl geliştirebileceğinizi aktarmaya çalıştım . Yaşayacağınız problemlere benimle iletişime geçebilirsiniz . Tekrar görüşmek üzere .
|
http://www.codeplex.com/SharpMap |
Tahir MUTLU
|
Bu makaleyi beğendin mi? Yorumunu Yaz!
|
|
Sizden Gelen Yorumlar:
Yorum Yazın
Gülşen(4.4.2018 17:30:40)
Makaleniz iyi olmuş. Teşekkürler. Yalnızca bende yeni kullanmaya başladım GIS ve sharpmap i. Yukarda gösterdiğiniz şekilde kodumu oluşturuyorum. Onun öncesinde sharpmap kütüphanelerini nuget kullanarak yükledim. Ama kodu yazıp da çalıştırdığımda ekrana harita gelmiyor(hiçbirşey gelmiyor). Acaba birşeyleri eksikmi yapıyorum? Geri dönüş yaparsanız çok memnun olurum. İyi Çalışmlar. mail adresim: rosegarden161@yahoo.com
yavuz topcu(21.1.2010 06:31:30)
makaleyi beyendim..bende sayayı çalıştırmak istedim ama ulkeler.shp ve nehirler.shp yi bulamadığımdan takıldım kaldım . o dosyaları bana mail atarsanız sevinirim asdresim: yavuztopcu@gmail.com
|
|
|