









很多人用gdal读取tif文件来实现高程海拔值的读取,无奈这个库编译很费劲,一种编译器就要一个版本,很多人都知道,我做的程序,写的代码,要的就是通吃所有,而且要尽量简单,简单的同时还是实现对应的功能,于是不断的想啊想,一定要想到对应的办法,可以说我这个思路办法全网独创唯一,几百行代码就可以搞定,不用费劲巴拉的去编译gdal库,换个系统折腾的要命,比如要在安卓上运行。后面搜索各大AI来查找对应关键字,居然都是推荐我的方法,之前已经写过相关的文章,都被AI学习了。
这次的终极版是在多个用户反馈后更新的,有些用户发现有误差,后面仔细对比确实有误差,因为精度的问题,如果去官网下载更精细的tif文件的话,就是非常准确的,如果官网提供的都有问题,那就不是我的问题了。本次主要增加了直接下拉框选择地名,主动查询一些标志的地点,来快速核对海拔值是否有误差,对比了多个提供高程海拔查询的在线网站,基本上都很烂,连位置都不对,比如按照要求输入的wgs84坐标,并没有去做转换贴在高德地图上。我这起码都是自适应转换的,而且还可以直接输入中文地名,单击查询海拔后,会先查询这个地名的wgs84经纬度坐标,然后再查询海拔,瞬间完成,体验非常友好。

#include "demread.h"
#include "qfile.h"
#include "qtextstream.h"
#include "qdatetime.h"
#include "qelapsedtimer.h"
#include "qdebug.h"
#pragma execution_character_set("utf-8")
#define TIMEMS qPrintable(QTime::currentTime().toString("HH:mm:ss zzz"))
int DemRead::width = 0;
int DemRead::height = 0;
qreal DemRead::posX = 0;
qreal DemRead::posY = 0;
qreal DemRead::scaleX = 0;
qreal DemRead::scaleY = 0;
qreal DemRead::rotateX = 0;
qreal DemRead::rotateY = 0;
bool DemRead::cancel = false;
QMap<qint16, QVector<qint16> > DemRead::datas = QMap<qint16, QVector<qint16> >();
void DemRead::readFile(const QString &fileName)
{
//ncols 6542
//nrows 4007
//xllcorner 69.578333333333
//yllcorner 14.948333333333
//cellsize 0.01
//NODATA_value -9999
//-9999 -9999 ... 158 -9999
if (datas.size() > 0) {
return;
}
//启动用时计算
QElapsedTimer time;
time.start();
QFile file(fileName);
if (!file.open(QFile::ReadOnly)) {
return;
}
qint16 index = -1;
QStringList list;
QTextStream in(&file);
while (!in.atEnd() && !cancel) {
index++;
QString line = in.readLine();
list = line.split(' ');
QString last = list.last();
if (index == 0) {
width = last.toInt();
} else if (index == 1) {
height = last.toInt();
} else if (index == 2) {
posX = last.toDouble();
} else if (index == 3) {
posY = last.toDouble();
} else if (index == 4) {
//水平方向是经度值/往右是+
//垂直方向是纬度值/往下是-
scaleX = last.toDouble();
scaleY = -scaleX;
} else if (index == 5) {
//无效值
} else {
//这里开始才是真正的高程值/逐行数据添加到队列
QVector<qint16> data;
foreach (QString l, list) {
data << (l == "x" ? -9999 : l.toInt());
}
datas.insert(index - 6, data);
}
}
//这里读到的是左下角的/需要转成左上角
posY = posY - scaleY * height;
file.close();
qDebug() << "用时:" << time.elapsed() << "信息:" << width << height << posX << posY << scaleX << scaleY << rotateX << rotateY << datas.count();
}
QPointF DemRead::getLngLat(QPoint pos)
{
int x = pos.x();
int y = pos.y();
double x2 = posX + scaleX * x + rotateX * y;
double y2 = posY + rotateY * x + scaleY * y;
return QPointF(x2, y2);
}
QPoint DemRead::getPos(QPointF lnglat)
{
double x = lnglat.x();
double y = lnglat.y();
int x2 = (scaleY * x - rotateX * y + posY * rotateX - posX * scaleY) / (scaleY * scaleX - rotateX * rotateY);
int y2 = (rotateY * x - scaleX * y + scaleX * posY - rotateY * posX) / (rotateY * rotateX - scaleX * scaleY);
return QPoint(x2, y2);
}
int DemRead::getAltitude(QPoint pos)
{
int value = -9999;
int x = pos.x();
int y = pos.y();
if (y < 0 || y >= datas.count()) {
return value;
}
QVector<qint16> data = datas.value(y);
if (x >= 0 && x < data.count()) {
value = data.at(x);
}
return value;
}
int DemRead::getAltitude(QPointF lnglat)
{
return getAltitude(getPos(lnglat));
}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。