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.
Ç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
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);
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:
Ç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
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
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 |
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.




































