1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
| private void btnouvrir_Click(object sender, EventArgs e)
{
degrelat = 0;
minuteslat = 0;
degrelong = 0;
minuteslong = 0;
conversionlat = 0;
conversionlong = 0;
geodata = null;
PICTTBL = null;
coordon = null;
affichage = null;
StreamReader lecture = new StreamReader("c:/champ.txt");
while (lecture.EndOfStream!=true)
{
string ligne =" ";
ligne = lecture.ReadLine();
degrelat = Convert.ToInt32(ligne.Substring(0,2));
minuteslat = Convert.ToDouble(ligne.Substring(2,7).Replace('.',','));
degrelong = Convert.ToInt32(ligne.Substring(10,3));
minuteslong = Convert.ToDouble(ligne.Substring(13, 7).Replace('.',','));
reccoord.Add(ligne);
affichage = agricoltraits(minuteslong, minuteslat, degrelat, degrelong);
}
}
PointF[] agricoltraits(double minuteslong , double minuteslat , int degrelat , int degrelong )
{
////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////conversion d'angle en seconde en radian//////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
// conversion en seconde
conversionlat = (degrelat * 3600) + (minuteslat * 60);
conversionlong = (degrelong * 3600) + (minuteslong * 60);
/* si on est a l'ouest, la longitude est négative mais le gps ne l'indique pas au niveau des angle
si on est au sud , la latitude est négative mais le gps ne l'indique pas au niveau des angle
* se code ne s'y trouve plus attention car problème à resoudre par la suite
*/
// convrsion en radian
radlat = conversionlat * ((Math.PI) / (180 * 3600));
radlong = conversionlong * ((Math.PI) / (180 * 3600));
/*
formules
D= R*Math.Acos((Math.Sin (phi0) *Math.Sin (phi1))+ (Math.Cos (phi0)*Math.Cos(phi1)*Math.Cos(teta1-teta0)));
* le rayon moyen de la terre est de 6371km
* nous allons chercher la distance entre le point et l'équateur et entre le point et le méridien0
* pour cela , il faut soit annuler phi0 soit têta.
* ce qui revient a dire d'annuler soit lat soit long en fonction de la distance que l'on veut.
* ces deux distance vont permettre de se reperer dans le plan X et Y pour pouvoir retracer le champ
*/
//distance entre Le point de l'equateur => on mesure une latitude. => même longitude
deb = 6371000 * Math.Acos(Math.Cos(radlat));
// distance entre le meridien et le point => on mesure une longitude => même latitude
dmb = 6371000 * Math.Acos(Math.Cos(radlong));
//////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////// mise sous forme de point//////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
coordonnees.X = Convert.ToSingle(dmb);
coordonnees.Y = Convert.ToSingle(deb);
if (length == 0)
{
// on a besoin connaître une valeur de départ => la premiere valeur que l'on a sera la valeur de référence
// pour les minimums que programme va connaître
DEBMIN = coordonnees.Y;
DMBMIN = coordonnees.X;
}
geodata.Add(coordonnees);// on ajoute le point a la liste de pointf
// attention il faut minimum deux point ....
if (length > 2)
{
foreach (PointF P in geodata)// on parcourt la liste de pointf
{
if (P.Y > DEBMAX)
{
DEBMAX = P.Y;
}
if (P.Y < DEBMIN)
{
DEBMIN = P.Y;
}
DELTADEB = DEBMAX - DEBMIN;// distance entre les deux points latitudinalement dont on a besoin
if (P.X > DMBMAX)
{
DMBMAX = P.X;
}
if (P.X < DMBMIN)
{
DMBMIN = P.X;
}
DELTADMB = DMBMAX - DMBMIN;// distance entre les deux points longitudinalement dont on a besoin
// instauration d'une echelle en X et en Y
echelleX = (DELTADMB / pictureBox.Width);
echelleY = (DELTADEB / pictureBox.Height);
}
}
// pour retranscrir et centrer sur la picture box :
// pt.X = (pictureBox1.Width / 2) + nombrex; //
// pt.Y = (pictureBox1.Height / 2) - nombrey;//
// de plus, on soustrait DMB a deb min pour la reference de la picturebox1
PICTB.X = (pictureBox.Width / 2) + (echelleX * (Convert.ToSingle(dmb) - DMBMIN));
PICTB.Y = (pictureBox.Height / 2) - echelleY * (Convert.ToSingle(deb) - DEBMIN);
PICTTBL.Add(PICTB);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
coordon = PICTTBL.ToArray();// tableau de pointf
length = length + 1;
return coordon;
// on returne le tableau qui sera affiché sur la picture box
}
private void pictureBox1_Click(object sender, EventArgs e)
{
}
} |
Partager