5 #include "../canvas/MapDisplay.h"
6 #include "../canvas/Canvas.h"
9 #include <QtCore/QPropertyAnimation>
10 #include <QtGui/QPainter>
11 #include <QtGui/QImage>
12 #include <QtCore/QVector>
33 for (
size_t i = 0; i < 256; ++i)
34 m_lut[(uchar)i] = QColor((
int)i, (
int)i, (
int)i, 255);
43 QString f = m_files[0];
44 QString file = m_dir.path() +
"/" + f;
49 double fat = ar.width() / dr.width();
51 QRectF r(0, 0, ((
double)ima.rect().width() / 4.) / fat, ((double)ima.rect().height() / 4.) / fat);
52 m_imaRect = m_matrix.inverted().mapRect(r);
53 m_imaRect.moveCenter(p);
58 if (getCtlParameters() ==
false)
65 m_animation->m_spatialExtent =
te::gm::Envelope(m_imaRect.x(), m_imaRect.y(), m_imaRect.right(), m_imaRect.bottom());
66 m_animation->setEasingCurve(QEasingCurve::Linear);
69 QString suffix =
"." + m_suffix;
70 QStringList nameFilter;
71 nameFilter.append(
"*" + suffix);
72 QStringList files = m_dir.entryList(nameFilter, QDir::Files, QDir::Name);
73 size_t count = files.count();
82 for (
size_t i = 0; i < count; ++i)
84 QString f = files[(int)i];
98 QString file(m_dir.path() +
"/image.ctl");
99 FILE* fp = fopen(file.toStdString().c_str(),
"r");
103 fread(buf, 2000,
sizeof(
char), fp);
105 QString s, ss(QString(buf).simplified());
108 if (!(ss.contains(
"suffix ", Qt::CaseInsensitive) && ss.contains(
"undef", Qt::CaseInsensitive) &&
109 ss.contains(
"srid", Qt::CaseInsensitive) && ss.contains(
"llx", Qt::CaseInsensitive) &&
110 ss.contains(
"lly", Qt::CaseInsensitive) && ss.contains(
"urx", Qt::CaseInsensitive) &&
111 ss.contains(
"ury", Qt::CaseInsensitive)))
115 size_t pos = ss.indexOf(
"suffix ", Qt::CaseInsensitive) + strlen(
"suffix ");
116 ss.remove(0, (
int)pos);
117 pos = ss.indexOf(
" undef", Qt::CaseInsensitive);
118 s = ss.left((
int)pos);
120 ss.remove(0, (
int)pos);
123 pos = ss.indexOf(
"undef ", Qt::CaseInsensitive) + (int)strlen(
"undef ");
124 ss.remove(0, (
int)pos);
125 pos = ss.indexOf(
" srid", Qt::CaseInsensitive);
126 s = ss.left((
int)pos);
127 m_undef = atof(s.toStdString().c_str());
128 ss.remove(0, (
int)pos);
131 pos = ss.indexOf(
"srid ", Qt::CaseInsensitive) + (int)strlen(
"srid ");
132 ss.remove(0, (
int)pos);
133 pos = ss.indexOf(
" llx", Qt::CaseInsensitive);
134 s = ss.left((
int)pos);
135 m_SRID = atoi(s.toStdString().c_str());
136 ss.remove(0, (
int)pos);
139 pos = ss.indexOf(
"llx ", Qt::CaseInsensitive) + strlen(
"llx ");
140 ss.remove(0, (
int)pos);
141 pos = ss.indexOf(
" lly", Qt::CaseInsensitive);
142 s = ss.left((
int)pos);
143 double llx = atof(s.toStdString().c_str());
144 ss.remove(0, (
int)pos);
147 pos = ss.indexOf(
"lly ", Qt::CaseInsensitive) + (int)strlen(
"lly ");
148 ss.remove(0, (
int)pos);
149 pos = ss.indexOf(
" urx", Qt::CaseInsensitive);
150 s = ss.left((
int)pos);
151 double lly = atof(s.toStdString().c_str());
152 ss.remove(0, (
int)pos);
155 pos = ss.indexOf(
"urx ", Qt::CaseInsensitive) + strlen(
"urx ");
156 ss.remove(0, (
int)pos);
157 pos = ss.indexOf(
" ury", Qt::CaseInsensitive);
158 s = ss.left((
int)pos);
159 double urx = atof(s.toStdString().c_str());
160 ss.remove(0, (
int)pos);
163 pos = ss.indexOf(
"ury ", Qt::CaseInsensitive) + strlen(
"ury ");
164 ss.remove(0, (
int)pos);
165 double ury = atof(ss.toStdString().c_str());
167 double w = urx - llx;
168 double h = ury - lly;
169 m_imaRect = QRectF(llx, lly, w, h);
180 if (m_currentImageFile.isEmpty())
183 QString file = m_currentImageFile;
184 m_image =
new QImage(file);
194 tryDoReprojectionUsingAffineTransform(painter);
197 if (m_opacity == 255)
198 painter->drawImage(r, *m_image);
201 QSize size = m_image->size();
202 int width = size.width();
203 int height = size.height();
205 if (m_image->format() == QImage::Format_ARGB32)
207 for (
int i = 0; i < height; ++i)
209 unsigned char* u = m_image->scanLine(i);
210 for (
int j = 0; j < width; ++j)
212 QRgb* v = (QRgb*)(u + (j << 2));
214 *v = qRgba(qRed(*v), qGreen(*v), qBlue(*v), m_opacity);
217 painter->drawImage(r, *m_image);
221 QImage img(size, QImage::Format_ARGB32);
222 for (
int i = 0; i < height; ++i)
224 unsigned char* u = m_image->scanLine(i);
225 unsigned char* uu = img.scanLine(i);
227 for (
int j = 0; j < width; ++j)
229 QRgb* v = (QRgb*)(u + (j << 2));
230 QRgb* uv = (QRgb*)(uu + (j << 2));
232 *uv = qRgba(qRed(*v), qGreen(*v), qBlue(*v), m_opacity);
235 painter->drawImage(r, img);
248 if (m_display->getSRID() !=
TE_UNKNOWN_SRS && m_display->getSRID() != m_SRID)
252 line.
setPoint(0, m_imaRect.x(), m_imaRect.y());
253 line.
setPoint(1, m_imaRect.x(), m_imaRect.y() + m_imaRect.height());
254 line.
setPoint(2, m_imaRect.x() + m_imaRect.width(), m_imaRect.y() + m_imaRect.height());
255 line.
setPoint(3, m_imaRect.x() + m_imaRect.width(), m_imaRect.y());
256 line.
setPoint(4, m_imaRect.center().x(), m_imaRect.center().y());
257 line.
setPoint(5, m_imaRect.x(), m_imaRect.center().y());
258 line.
setPoint(6, m_imaRect.x() + m_imaRect.width(), m_imaRect.center().y());
259 line.
setPoint(7, m_imaRect.center().x(), m_imaRect.y());
260 line.
setPoint(8, m_imaRect.center().x(), m_imaRect.y() + m_imaRect.height());
274 QPointF ph1(p0 - p1);
275 QPointF ph2(p3 - p2);
277 QPointF pw1(p2 - p1);
278 QPointF pw2(p3 - p0);
279 QPointF prot(p6 - c);
281 double w = fabs(pw.x());
282 double h = fabs(ph.y());
284 double PI = 3.14159265;
286 painter->translate(c.toPoint());
295 else if (prot.y() == 0)
304 rad = atan(prot.y() / prot.x());
318 h /= fabs(cos(PI + rad));
322 r.moveCenter(c.toPoint());
324 if (ph1.x() != 0 && ph2.x() != 0 && ph1.y() == ph2.y())
326 double horiz = (ph1.x() + ph2.x()) / 1.35;
327 painter->shear(horiz / w, 0);
329 else if (pw1.y() != 0 && pw2.y() != 0 && pw1.x() == pw2.x())
331 double vert = (pw1.y() + pw2.y()) / 1.35;
332 painter->shear(0, vert / h);
336 double degree = rad * 180. /
PI;
337 painter->rotate(degree);
339 painter->translate(-c.toPoint());
346 m_animationFiles.clear();
348 te::dt::TimeInstant iTime = m_animation->m_temporalAnimationExtent.getInitialTimeInstant();
352 size_t size = m_time.size();
354 for (
int i = 0; i < (int)size; ++i)
356 if (m_time[i] == iTime || m_time[i] > iTime)
362 for (
int i = (
int)size - 1; i >= 0; --i)
364 if (m_time[i] == fTime || m_time[i] < fTime)
372 size_t tfim = ini + size;
374 size_t count = m_files.count();
378 for (
int i = (
int)ini; i < (int)tfim; ++i)
380 QString f = m_files[i];
381 m_animationFiles.push_back(f);
387 unsigned int curTime = m_animation->currentTime();
388 if (m_curTimeDuration == curTime)
391 drawForward(curTime);
397 m_curTimeDuration = curTime;
398 calculateCurrentFile(curTime);
404 drawForward(curTime);
409 calculateCurrentFile(m_curTimeDuration);
415 double nt = (double)curTime / (
double)m_duration;
416 int ind = m_animation->getAnimationDataIndex(nt);
417 if (ind >= 0 && ind < m_animationFiles.count())
419 QString f = m_animationFiles[ind];
420 m_currentImageFile = m_dir.path() +
"/" + f;
423 m_currentImageFile.clear();
425 m_curTimeDuration = curTime;
430 QRectF r = m_imaRect;
431 if (m_display->getSRID() !=
TE_UNKNOWN_SRS && m_display->getSRID() != m_SRID)
434 e.
transform(m_SRID, m_display->getSRID());
435 r.setRect(e.getLowerLeftX(), e.getLowerLeftY(), e.getWidth(), e.getHeight());
438 return m_matrix.mapRect(r).toRect();
444 std::vector<std::pair<int, QColor> >::const_iterator it = tab.begin();
445 size_t v = (*it).first;
446 QColor c = (*it).second;
450 m_lut[(uchar)i++] = c;
461 m_lut[(uchar)i++] = c;
467 size_t count = m_files.count();
471 QPointF pos(m_animation->m_spatialExtent.m_llx, m_animation->m_spatialExtent.m_lly);
472 double w = m_animation->m_spatialExtent.getWidth();
473 double h = m_animation->m_spatialExtent.getHeight();
475 double dw = w / (double)tam;
476 double dh = h / (double)tam;
480 m_route->setPoint(i, pos.x(), pos.y());
482 pos -= QPointF(dw, dh);
484 pos += QPointF(dw, dh);
Point * getPointN(std::size_t i) const
It returns the specified point in this LineString.
double getWidth() const
It returns the envelope width.
A class to represent time instant.
double m_llx
Lower left corner x-coordinate.
This file defines a class for a Animation Scene.
LineString is a curve with linear interpolation between points.
const double & getY() const
It returns the Point y-coordinate value.
void setPoint(std::size_t i, const double &x, const double &y)
It sets the value of the specified point.
An Envelope defines a 2D rectangular region.
#define TE_UNKNOWN_SRS
A numeric value to represent a unknown SRS identification in TerraLib.
double m_lly
Lower left corner y-coordinate.
A class to represent time period.
This file defines a class for a Trajectory Animation.
void transform(int oldsrid, int newsrid)
It will transform the coordinates of the Envelope from the old SRS to the new one.
double getHeight() const
It returns the envelope height.
const double & getX() const
It returns the Point x-coordinate value.
void transform(int srid)
It converts the coordinate values of the linestring to the new spatial reference system.