7 #include <QNetworkAccessManager>
9 #include <QNetworkRequest>
10 #include <QNetworkReply>
11 #include <QXmlStreamReader>
13 #include <QXmlStreamAttributes>
15 #include <QGeoPositionInfo>
19 const double KkjZoneInfo[6][2] = {
32 Location::Location( const QString &x, const QString &y, const QString &label ) :
41 Location::Location(const QGeoPositionInfo &positionInfo, const QString &label) :
48 setLocation(positionInfo);
51 void Location::setLocation(const QGeoPositionInfo &positionInfo)
53 qDebug() << "Setting new location based on GeoPositionInfo";
54 qreal latitude = positionInfo.coordinate().latitude();
55 qreal longitude = positionInfo.coordinate().longitude();
57 //qDebug() << "Calculating new values";
62 WGS84lola_to_KKJxy( longitude, latitude, &outX, &outY);
64 /*qDebug() << "Storing new values";
70 //qDebug() << "Setting x";
71 //this->m_x = QString("%1").arg(outX);
72 this->m_x.setNum(outX);
73 //qDebug() << "Setting y";
74 //this->m_y = QString("%1").arg(outY);
75 this->m_y.setNum(outY);
76 //qDebug() << "Setting as valid";
78 //emit(becomeValid());
79 //qDebug() << "Location set";
83 void Location::setPosition(const QString &x, const QString &y)
90 Location::Location(const QString &label) :
99 Location::Location(const Location &other) :
100 m_label(other.m_label),
101 m_address(other.m_address),
104 m_valid(other.m_valid)
108 /*Location* Location::copy_Location(const Location *other)
110 Location *ret = new Location(other->m_x, other->m_y, other->m_label);
111 ret->m_address = other->m_address;
112 ret->m_valid = other->m_valid;
117 QString Location::x() const
122 QString Location::y() const
127 void Location::setLabel(const QString &label)
132 QString Location::label() const
137 void Location::setAddress(const QString &address)
142 QString Location::address() const
147 bool Location::isValid() const
152 // Degrees to radians
153 double radians(double deg)
155 return deg * M_PI / 180.0;
158 // Radians to degrees
159 double degrees(double rad)
161 return rad * 180.0 / M_PI;
164 // Function: KKJ_Zone_I
165 int KKJ_Zone_I(KKJ easting)
167 int zoneNumber = floor(easting / 1000000.0);
168 if (zoneNumber < 0 || zoneNumber > 5) {
175 // Function: KKJ_Zone_Lo
176 int KKJ_Zone_Lo(double kkjlo)
178 // determine the zonenumber from KKJ easting
179 // takes KKJ zone which has center meridian
180 // longitude nearest (in math value) to
181 // the given KKJ longitude
183 while (zoneNumber >= 0) {
184 if (fabs(kkjlo - KkjZoneInfo[zoneNumber][0]) <= 1.5) {
194 // Function: KKJlalo_to_WGS84lalo
195 void KKJlola_to_WGS84lola(double kkjlo, double kkjla, double *outLongitude, double *outLatitude)
197 double dLa = radians(0.124867E+01 + -0.269982E+00 * kkjla + 0.191330E+00 * kkjlo + 0.356119E-02 * kkjla * kkjla + -0.122312E-02 * kkjla * kkjlo + -0.335514E-03 * kkjlo * kkjlo) / 3600.0;
198 double dLo = radians(-0.286111E+02 + 0.114183E+01 * kkjla + -0.581428E+00 * kkjlo + -0.152421E-01 * kkjla * kkjla + 0.118177E-01 * kkjla * kkjlo + 0.826646E-03 * kkjlo * kkjlo) / 3600.0;
200 *outLatitude = degrees(radians(kkjla) + dLa);
201 *outLongitude = degrees(radians(kkjlo) + dLo);
205 // Function: WGS84lalo_to_KKJlalo
206 void WGS84lola_to_KKJlola(double longitude, double latitude, double *outLongitude, double *outLatitude)
208 double dLa = radians(-0.124766E+01 + 0.269941E+00 * latitude + -0.191342E+00 * longitude + -0.356086E-02 * latitude * latitude + 0.122353E-02 * latitude * longitude + 0.335456E-03 * longitude * longitude) / 3600.0;
209 double dLo = radians(0.286008E+02 + -0.114139E+01 * latitude + 0.581329E+00 * longitude + 0.152376E-01 * latitude * latitude + -0.118166E-01 * latitude * longitude + -0.826201E-03 * longitude * longitude) / 3600.0;
211 *outLatitude = degrees(radians(latitude) + dLa);
212 *outLongitude = degrees(radians(longitude) + dLo);
216 // Function: KKJlalo_to_KKJxy
217 void KKJlola_to_KKJxy(double lon, double lat, int zoneNumber, KKJ *outX, KKJ *outY)
220 double a = 6378388.0;
221 double f = 1.0 / 297.0;
222 double b = (1.0 - f) * a;
224 double c = (a / b) * a;
225 double ee = (a * a - bb) / bb;
226 double n = (a - b) / (a + b);
229 double Lo = radians(lon) - radians(KkjZoneInfo[zoneNumber][0]);
230 double cosLa = cos(radians(lat));
231 double NN = ee * cosLa * cosLa;
232 double LaF = atan(tan(radians(lat)) / cos(Lo * sqrt(1.0 + NN)));
233 double cosLaF = cos(LaF);
234 double t = (tan(Lo) * cosLaF) / sqrt(1.0 + ee * cosLaF * cosLaF);
235 double A = a / (1.0 + n);
236 double A1 = A * (1.0 + nn / 4.0 + nn * nn / 64.0);
237 double A2 = A * 1.5 * n * (1.0 - nn / 8.0);
238 double A3 = A * 0.9375 * nn * (1.0 - nn / 4.0);
239 double A4 = A * 35.0 / 48.0 * nn * n;
241 *outY = A1 * LaF - A2 * sin(2.0 * LaF) + A3 * sin(4.0 * LaF) - A4 * sin(6.0 * LaF);
242 *outX = c * log(t + sqrt(1.0 + t * t)) + 500000.0 + zoneNumber * 1000000.0;
245 // Function: KKJxy_to_KKJlalo
246 void KKJxy_to_KKJlola(KKJ x, KKJ y, double *outLongitude, double *outLatitude)
248 // Scan iteratively the target area, until find matching
249 // KKJ coordinate value. Area is defined with Hayford Ellipsoid.
250 int zoneNumber = KKJ_Zone_I(x);
251 double minLo = radians(18.5);
252 double maxLo = radians(32.0);
253 double minLa = radians(59.0);
254 double maxLa = radians(70.5);
260 double deltaLo = maxLo - minLo;
261 double deltaLa = maxLa - minLa;
262 *outLongitude = degrees(minLo + 0.5 * deltaLo);
263 *outLatitude = degrees(minLa + 0.5 * deltaLa);
264 KKJlola_to_KKJxy(*outLongitude, *outLatitude, zoneNumber, &tmpX, &tmpY);
266 minLa = minLa + 0.45 * deltaLa;
268 maxLa = minLa + 0.55 * deltaLa;
272 minLo = minLo + 0.45 * deltaLo;
274 maxLo = minLo + 0.55 * deltaLo;
281 void WGS84lola_to_KKJxy(double longitude, double latitude, KKJ *outX, KKJ *outY)
285 WGS84lola_to_KKJlola(longitude, latitude, &kkjlo, &kkjla);
286 int zoneNumber = KKJ_Zone_Lo(kkjlo);
287 KKJlola_to_KKJxy(kkjlo, kkjla, zoneNumber, outX, outY);
290 void KKJxy_to_WGS84lola(KKJ x, KKJ y, double *outLongitude, double *outLatitude)
294 KKJxy_to_KKJlola(x, y, &kkjlo, &kkjla);
295 KKJlola_to_WGS84lola(kkjlo, kkjla, outLongitude, outLatitude);