在地图上添加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/ ...
随机推荐
- c语言的笔记
下面把我这半年来记的一些C语言的笔记贴出来. 1 C语言中函数参数传递是按照“值传递”进行的,即单向传递. 2 函数原型:函数类型 函数名(参数类型,参数类型……),可以不必加参数名,因为操作系统 ...
- STM32下载方法
一.JLINK下载方法 1.硬件设置 Boot0,Boot1 = 0,*(测试通过) Boot0,Boot1 = 1,0或者0,1(未测试) 2.软件设置 MDK设置 ① 选择Project -> ...
- CSS3------background-size(背景图片尺寸属性)
background-size 可以设置背景图片的大小,数值包括 长度length和百分比percentage. 并且会根据背景原点位置 background-origin 设置其图片覆盖的范围.那么 ...
- C# 两个获得程序运行路径的函数
EXE文件的存储路径,不太受调用时环境变量的影响: Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Lo ...
- VMware下打开Chrome OS遇到没有网络连接可用
打开ChromeOS.vmx文件,最后一行添加 ethernet0.virtualDev = "e1000" 就能解决.
- 【2011 Greater New York Regional 】Problem H: Maximum in the Cycle of 1
也是一个数学题: 主要用到的是排列组合的知识,推推公式就行了,挺简单的: 唯一要注意的是A(0,0)=1: 在这个上面WA了几次,= = 代码: #include<stdio.h> #de ...
- SectionIndexer中的getSectionForPosition()与getPositionForSection()
大家在做字母索引的时候常常会用到SectionIndexer这个类,里面有2个重要的方法 1. getSectionForPosition()通过该项的位置,获得所在分类组的索引号 2. getP ...
- ruby条件控制结构
一.比较语句 大部分和其他的语言一样,这里注意<=>. 条件语句 如下几种形式 if if ..else.. end if..elsif..else..end unless(if not) ...
- 【HDOJ】1753 大明A+B
注意数据格式,可以是整数,并且注意输出最简化浮点数. #include <stdio.h> #include <string.h> #define MAXNUM 420 cha ...
- bzoj2553
似乎挂精度了,不过这是一道好题 很明显看题知算法,知道这道题肯定是AC自动机上矩阵乘法 首先要明确一点,对一个字符串,怎样划分禁忌串最多 根据求最多不相交线段可知,从头到尾能划分出禁忌串就划分 根据这 ...