在地图上添加POI
使用Tangram的Marker, 可以在地图上做各种标记, 效果图:
Tangram是通过Marker在地图上添加标记的,Marker分Point, Polyline和Polygon三种, 分别对应点、线、面三种几何体。
Tangram使用统一的Marker接口来管理Marker:
namespace Tangram {
class Map { public:
// Add a marker object to the map and return an ID for it; an ID of 0 indicates an invalid marker;
// the marker will not be drawn until both styling and geometry are set using the functions below.
MarkerID markerAdd(); // Remove a marker object from the map; returns true if the marker ID was found and successfully
// removed, otherwise returns false.
bool markerRemove(MarkerID _marker); // Set the styling for a marker object; _styling is a string of YAML that specifies a 'draw rule'
// according to the scene file syntax; returns true if the marker ID was found and successfully
// updated, otherwise returns false.
bool markerSetStyling(MarkerID _marker, const char* _styling); // Set a bitmap to use as the image for a point marker; _data is a buffer of RGBA pixel data with
// length of _width * _height; pixels are in row-major order beginning from the bottom-left of the
// image; returns true if the marker ID was found and successfully updated, otherwise returns false.
bool markerSetBitmap(MarkerID _marker, int _width, int _height, const unsigned int* _data); // Set the geometry of a marker to a point at the given coordinates; markers can have their
// geometry set multiple times with possibly different geometry types; returns true if the
// marker ID was found and successfully updated, otherwise returns false.
bool markerSetPoint(MarkerID _marker, LngLat _lngLat); // Set the geometry of a marker to a point at the given coordinates; if the marker was previously
// set to a point, this eases the position over the given duration in seconds with the given EaseType;
// returns true if the marker ID was found and successfully updated, otherwise returns false.
bool markerSetPointEased(MarkerID _marker, LngLat _lngLat, float _duration, EaseType _ease); // Set the geometry of a marker to a polyline along the given coordinates; _coordinates is a
// pointer to a sequence of _count LngLats; markers can have their geometry set multiple times
// with possibly different geometry types; returns true if the marker ID was found and
// successfully updated, otherwise returns false.
bool markerSetPolyline(MarkerID _marker, LngLat* _coordinates, int _count); // Set the geometry of a marker to a polygon with the given coordinates; _counts is a pointer
// to a sequence of _rings integers and _coordinates is a pointer to a sequence of LngLats with
// a total length equal to the sum of _counts; for each integer n in _counts, a polygon is created
// by taking the next n LngLats from _coordinates, with winding order and internal polygons
// behaving according to the GeoJSON specification; markers can have their geometry set multiple
// times with possibly different geometry types; returns true if the marker ID was found and
// successfully updated, otherwise returns false.
bool markerSetPolygon(MarkerID _marker, LngLat* _coordinates, int* _counts, int _rings); // Set the visibility of a marker object; returns true if the marker ID was found and successfully
// updated, otherwise returns false.
bool markerSetVisible(MarkerID _marker, bool _visible); // Set the ordering of point marker object relative to other markers; higher values are drawn 'above';
// returns true if the marker ID was found and successfully updated, otherwise returns false.
bool markerSetDrawOrder(MarkerID _marker, int _drawOrder); // Remove all marker objects from the map; Any marker IDs previously returned from 'markerAdd'
// are invalidated after this.
void markerRemoveAll();
};
}
我觉得使用统一的接口来处理Marker在易用性有些欠缺, 因此决定使用单独的class来处理: Marker, Polyline, Polygon.
Tangram使用各种style来处理Marker的显示效果, 可能是对Tangram的实现还没有了解清楚, 暂时没有发现直接给一个Marker加上label的方法, 只好采用了一个hack的方法: 同时生成两个Tangram::Marker, 一个用来显示icon, 另一个用来显示label。
头文件:
class MarkerImpl: public Marker
{
public:
MarkerImpl(Tangram::Map* map);
~MarkerImpl(); // Mark interface
private:
virtual void setImage(const std::string &iconURI) override;
virtual void setTitle(const std::string &title) override; private:
Tangram::Map* m_map;
Tangram::MarkerID m_iconID; //use this marker to show icon
Tangram::MarkerID m_labelID; //use this marker to show label };
实现
void MarkerImpl::setImage(const std::string &iconURI)
{
QImage img(QString(iconURI.c_str())); int width = img.width();
int height = img.height();
auto argb = new unsigned int [width * height];
for(int h=height-; h>-; --h){
for(int w=; w<width; ++w){
int pix = img.pixelColor(w, h).rgba();
int pb = (pix >> ) & 0xff;
int pr = (pix << ) & 0x00ff0000;
int pix1 = (pix & 0xff00ff00) | pr | pb;
argb[w + h*width] = pix1;
}
} m_map->markerSetBitmap(m_iconID, width, height, argb); const char* MARKER_ICON_STYLE = "{ style: 'points', color: 'white', size: [%1px, %1px], order: 100, collide: false }";
QString iconStyle = QString(MARKER_ICON_STYLE).arg(width).arg(height);
m_map->markerSetStyling(m_iconID, iconStyle.toStdString().c_str()); delete[] argb;
} void MarkerImpl::setTitle(const std::string &title)
{
const char* MARKER_TEXT_STYLE = "{ style: 'text', text_source: 'function(){ return \"%1\"}', offset: [0px, 24px], text_wrap: false}";
QString labelStyle = QString(MARKER_TEXT_STYLE).arg(title.c_str());
m_map->markerSetStyling(m_labelID, labelStyle.toStdString().c_str());
}
Tangram的核心特性是可配置性, 通过一个YAML scene文件, 定义不同的style, 可以配置几乎所有的显示效果。 这是一个很大的话题, 以后单独分析
在地图上添加POI的更多相关文章
- 在地图上添加POI(二)
在上一篇中实现一个icon + label的Marker需要使用两个Tangram的Marker, 今天分析了Tangram的源码后, 发现Tangram时支持单一Marker同时显示的, 这需要使用 ...
- GMap.Net开发之在地图上添加多边形
上一篇介绍了在GMap上添加自定义标签(GMapMarker),这篇介绍在GMap上添加多边形(GMapPolyogn),并且介绍如何在地图上画任意的多边形. 如果已经知道了多边形的各个点的位置,就可 ...
- google maps js v3 api教程(2) -- 在地图上添加标记
原文链接 google maps javascript官方文档:https://developers.google.com/maps/documentation/javascript/ 我们在创建地图 ...
- 【百度地图API】如何在地图上添加标注?——另有:坐标拾取工具+打车费用接口介绍
原文:[百度地图API]如何在地图上添加标注?--另有:坐标拾取工具+打车费用接口介绍 摘要: 在这篇文章中,你将学会,如何利用百度地图API进行标注.如何使用API新增的打车费用接口. ------ ...
- 【百度地图API】建立全国银行位置查询系统(三)——如何在地图上添加银行标注
原文:[百度地图API]建立全国银行位置查询系统(三)--如何在地图上添加银行标注 <摘要>你将在第三章中学会以下知识: 如何在地图上添加带银行logo的标注?(你也可以换成商场logo, ...
- 微信小程序--地图上添加图片
如何在微信小程序地图添加上,添加图片? 在微信小程序中,地图的层级最高,所以我们没有办法,通过定位,在地图上添加图片等信息; 处理办法: 添加控件:controls; 其中有个属性position,进 ...
- 利用WPF建立自己的3d gis软件(非axhost方式)(四)在地图上添加FrameworkElement
原文:利用WPF建立自己的3d gis软件(非axhost方式)(四)在地图上添加FrameworkElement 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUw ...
- Google Map API v2 (三)----- 地图上添加标记(Marker),标记info窗口,即指定经纬度获取地址字符串
接上篇 http://www.cnblogs.com/inkheart0124/p/3536322.html 1,在地图上打个标记 private MarkerOptions mMarkOption; ...
- ArcGIS 在地图上添加标注
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
随机推荐
- log4N配置方式
方式一. <log4net> <!-- 启动日志 --> <appender name="PayAppender" type="log4ne ...
- 【转】centOS中mysql一些常用操作
安装mysql yum -y install mysql-server 修改mysql配置vi /etc/my.cnf 这里会有很多需要注意的配置项,后面会有专门的笔记暂时修改一下编码(添加在密码下方 ...
- SQL Server 2012 Features
SQL SQL Server 2012 新增加的几个函数: SELECT CONVERT (INT, 'Angkor-216.00') 直接报错 SELECT TRY_CONVERT(INT, 'SS ...
- .where(provider).FirstOrDefault()和.FirstOrDefault(provider)的性能比较
最近遇到一个关于Linq的问题,.where(provider).FirstOrDefault();和.FirstOrDefault(provider);的性能比较 关于这个主要有以下三种说法,但这方 ...
- hdu 4442
一道超级easy的贪心 一眼看出了他的本质: 代码: #define mod 31536000 #include<cstdio> #include<algorithm> #in ...
- 关于 OneAPM Cloud Test DNS 监控的几个重要问题
你注意到了吗?OneAPM Cloud Test 已经全面开启支持 DNS 监控了! CT 产品自上线以来一直致力于产品完善,希望能够尽可能全面地满足用户需求,为您提供完美的用户体验.目前 Cloud ...
- MVVM_Android-CleanArchitecture
前言 "Architecture is About Intent, not Frameworks" - Robert C. Martin (Uncle Bob) Uncle Bob ...
- ajax 初始化请求前携带参数
$(function () { function SetAjax(wxOpenId, departCode) { $.ajaxSetup({ xhrF ...
- JSOI2015 Round1——完挂
感觉眼前天地转了转…… Day 0 和zxy,zyh一同坐车去扬中,同行的还有llr 路上zyh基本在睡觉…… 入住的宾馆各种坑爹,同一层住的两个房间一个有网一个没网 我有幸入住了有网的房间,zyh在 ...
- SharePoint用户控件编写的简单介绍
转:http://www.it165.net/design/html/201204/1131.html 我们开发中,通常需要写各种各样的部件来实现我们的展示或者功能,下面就介绍下刚刚接触的QuickP ...