赞
踩
标注点在地图开发中是最常见的应用场景之一,比如在地图上需要显示设备的位置,基本上都是添加标注点,指定图片和尺寸已经经纬度坐标位置。这个功能在每种地图内核中都提供的,这个并没有任何难点,在这个功能点上最大难题或者说是设计细节就是,标注点该如何对齐,比如水滴形状的图标一般是底部居中对齐更美观,刚好水滴的头在指定的经纬度坐标上,整个图标位于正上方。还有一种情况是圆形的图标,这种最美观的方式是中间居中对齐,也就是图片的中心点在指定的经纬度坐标上,更符合实际的情况,如果说是底部,则看起来可能会很怪。
不同地图内核提供了不同的函数设置图标位置,百度地图是通过setOffset设置偏移值,这个值需要自己根据图片的大小自己计算好再设置。高德地图是通过setAnchor指定位置字符串来设置,比如setAnchor(‘center’)是中间居中,setAnchor(‘bottom-center’)是底部居中,这种方式蛮好的,他会自己根据图片尺寸进行设置。天地图是通过设置marker的属性参数iconAnchor偏移值控制。腾讯地图很特殊,他是通过设置图标MarkerImage对象的anchor参数来控制的。
在marker标注点的旁边还可以显示一个跟随的文本,表示名称之类的信息,百度地图和高德地图都在marker对象的函数中就提供了处理,而天地图和腾讯地图需要自己new一个label对象,这个对象设置对应的位置为marker的位置来实现。
#include "frmmapdemomarker.h" #include "ui_frmmapdemomarker.h" #include "qthelper.h" #include "maphelper.h" frmMapDemoMarker::frmMapDemoMarker(QWidget *parent) : QWidget(parent), ui(new Ui::frmMapDemoMarker) { ui->setupUi(this); this->initConfig(); } frmMapDemoMarker::~frmMapDemoMarker() { delete ui; } void frmMapDemoMarker::initConfig() { ui->cboxIcon->setCurrentIndex(AppConfig::MapDemoIcon); connect(ui->cboxIcon, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig())); } void frmMapDemoMarker::saveConfig() { AppConfig::MapDemoIcon = ui->cboxIcon->currentIndex(); AppConfig::writeConfig(); } void frmMapDemoMarker::receiveDataFromJs(const QString &type, const QVariant &data) { //不可见不用继续/说明不是本界面的操作触发的 if (!this->isVisible()) { return; } QString result = data.toString(); if (type == "click") { QString point = MapHelper::getLngLat2(result); ui->txtPoint->setText(point); } else if (type == "marker") { QtHelper::showMessageBoxInfo("当前单击了: " + result); } else if (type == "geocoderresult") { QStringList list = result.split("|"); QString flag = list.first(); if (flag == "AddrToPoint") { QString point = MapHelper::getLngLat2(list.last()); ui->txtPoint->setText(point); } else if (flag == "PointToAddr") { ui->txtAddr->setText(list.last()); } } else if (type == "searchresult") { //搞个文本框用于显示获取到的结果 static QTextEdit *edit = NULL; if (!edit) { edit = new QTextEdit; edit->resize(800, 600); edit->setReadOnly(true); } edit->setWindowTitle("搜索结果"); edit->setText(MapHelper::getSearchResult(result)); edit->show(); } } void frmMapDemoMarker::on_btnAddMarker_clicked() { QString name = ui->txtName->text().trimmed(); QString point = ui->txtPoint->text().trimmed(); QString image; int width = 23; int height = 25; bool center = false; static int index = -1; //可以指定本地图片文件或者网络图片/可设置图片的图标索引和尺寸等 int icon = ui->cboxIcon->currentIndex(); if (icon == 1) { image = "../mapimage/marker.png"; width = 45; height = 65; } else if (icon == 2) { image = "../mapimage/marker0.png"; width = 50; height = 50; center = true; } else if (icon == 3) { image = "../mapimage/ipc_red.png"; width = 25; height = 30; } else if (icon == 4) { image = "../mapimage/markers.png"; //image = "http://api.map.baidu.com/img/markers.png"; index++; //图标有限重置索引 if (index == 13) { index = 0; } } else if (icon == 5) { image = "../mapimage/gif_person.gif"; width = 68; height = 100; //可以通过换行来实现垂直展示文字 name = "垂<br/>直<br/>文<br/>字"; } //可以测试不同的默认值参数 QString js = QString("addMarker('%1', '%2', '%1')").arg(name).arg(point); js = QString("addMarker('%1', '%2', '%1', '%3')").arg(name).arg(point).arg(image); js = QString("addMarker('%1', '%2', '%1', '%3', %4, %5, %6, %7)").arg(name).arg(point).arg(image).arg(width).arg(height).arg(center).arg(index); emit runJs(js); //设置单击事件 js = QString("setClick('%1', 2)").arg(name); emit runJs(js); //自动将序号递增 if (name.startsWith("标注点")) { int index = name.mid(3, name.length()).toInt(); name = QString("标注点%1").arg(index + 1); ui->txtName->setText(name); } } void frmMapDemoMarker::on_btnDeleteMarker_clicked() { QString name = ui->txtName->text().trimmed(); QString js = QString("deleteMarker('%1')").arg(name); emit runJs(js); } void frmMapDemoMarker::on_btnSetMarker_clicked() { QString name = ui->txtName->text().trimmed(); QString point = ui->txtPoint->text().trimmed(); QString js = QString("setMarker('%1', '%2', %3)").arg(name).arg(point).arg(20); emit runJs(js); } void frmMapDemoMarker::on_btnClearMarker_clicked() { emit runJs("deleteMarker()"); } void frmMapDemoMarker::on_btnResetMarker_clicked() { //先清空所有点 on_btnClearMarker_clicked(); //然后添加多个点/这里随机生成坐标 QStringList names; names << "测试点1" << "测试点2" << "测试点3" << "测试点4" << "测试点5"; for (int i = 0; i < names.count(); ++i) { QString point = QString("121.%1%2,31.%3%4").arg(rand() % 7).arg(rand() % 100).arg(rand() % 4).arg(rand() % 100); QString js = QString("addMarker('%1', '%2', '%1')").arg(names.at(i), point); emit runJs(js); } } void frmMapDemoMarker::on_btnAddrToPoint_clicked() { QString addr = ui->txtAddr->text().trimmed(); emit runJs(QString("getPointByAddr('AddrToPoint', '%1')").arg(addr)); } void frmMapDemoMarker::on_btnPointToAddr_clicked() { QString point = ui->txtPoint->text().trimmed(); emit runJs(QString("getAddrByPoint('PointToAddr', '%1')").arg(point)); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。