UTFGrid
UTFGrid
UTFGrid is a specification for rasterized interaction data. As of version 1.2, it was removed from incubation in the MBTiles Specification and split into its own repository.
See CHANGELOG.md for per-version changes.
License
This specification is licensed under a Creative Commons Attribution 3.0 United States License.
Applications which make use of the specification are not subject to any restrictions.
Implementations
Write
- Mapnik's grid_renderer (Uses Antigrain Geometry library for rendering).
- Various python sample implementations
- GeoScript groovy example
- TileStache
- create-utfgrids
Read
- Wax for adding support to the Leaflet, Modest Maps, OpenLayers, and Google Maps clients: examples, code
- Leaflet.utfgrid
- OpenLayers Native: blog post, general demo,
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
UTFGrid
UTFGrid is a specification for rasterized interaction data. As of version 1.2, it was removed from incubation in the MBTiles Specification and split into its own repository.
See CHANGELOG.md for per-version changes.
License
This specification is licensed under a Creative Commons Attribution 3.0 United States License.
Applications which make use of the specification are not subject to any restrictions.
Implementations
Write
- Mapnik's grid_renderer (Uses Antigrain Geometry library for rendering).
- Various python sample implementations
- GeoScript groovy example
- TileStache
- create-utfgrids
Read
- Wax for adding support to the Leaflet, Modest Maps, OpenLayers, and Google Maps clients: examples, code
- Leaflet.utfgrid
- OpenLayers Native: blog post, general demo, example multi-grid, example geography-class
- GDAL MBTiles support
- Landez - Python module
Servers
- TileMill - via tilelive.js which uses tilelive-mapnik to request grid creation and node-mbtiles to cache and fetch grids stored in MBTiles format.
- TileStache's
TileStache.Goodies.Providers.MapnikGrid:Provider
- django-mbtiles which serves grids stored in MBTiles along with tiles using a simple template tag.
Authors
- Tom MacWright (tmcw)
- Will White (willwhite)
- Konstantin Kaefer (kkaefer)
- Justin Miller (incanus)
- Dane Springmeyer (springmeyer)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Interaction
Tile servers can enhance tilesets with interactivity by implementing two additional HTTP endpoints.
[base path]/layer.json
: A layer manifest JSON containing the interaction formatter function and other optional attributes.[base path]/{n}/{n}/{n}.grid.json
: A UTFGrid JSON file corresponding to its adjacent tile image.
[base path]
refers to the full layer URL prior to any x, y or z coordinates.
Examples:
OSM-style URL schema
http://example.com/0/0/0.png // tile image for 0/0/0
http://example.com/0/0/0.grid.json // utfgrid for 0/0/0
http://example.com/layer.json // layer manifest
TileJSON
UTFGrid requires additions to the TileJSON payload for a layer:
template
: String. In the format of a mustache template.legend
: String. Self-contained HTML that may be displayed as a legend for this layer. Optional.
Example response from layer.json
:
{
"template": "{{NAME}}",
"legend": "<strong>Countries of the World</strong>"
}
Each layer.json
item should be represented by a single row in the metadata
table where key,value
match its key and value in the layer.json
object.
Template
As of UTFGrid 1.1, the formatter
key is deprecated and replaced by template
. Template is to be a mustache format string that produces HTML, which will be cleaned with an HTML whitelist after generation.
Mustache
Template data is specified according to the mustache specification. The full specification is supported, but no partials are provided, or should be provided by implementations.
Given the switch to templates from formatters, the options
object is no longer available. Its functionality is emulated by setting 'format flags' on each data object.
For an example data object like
{
"id": "helloworld"
}
This will be transformed into
{
"id": "helloworld"
"__location__": true
}
By the tooltip/interaction implementation, in order to trigger the location
template. Note that true
, 1
, and all non-false values are equal to template, so implementations may set "__location__": 1
to save bytes.
The template implementation could be:
{{#__location__}}
http://your.com/{{id}}
{{/__location__}}
{{#__full__}}
This content has the id {{id}}
{{/__full__}}
{{#__teaser__}}
{{id}}
{{/__teaser__}}
Which, for this implementation, will produce the output
http://your.com/helloworld
legend
A tileset may provide an HTML string that can be rendered by the client as a legend. The string should be self-contained and not reference external stylesheets, scripts or images. The Data URI scheme may be used to embed images or other data if necessary.
<div><span style='padding:0px 10px; background:#333;'></span> +10% population</div>
<div><span style='padding:0px 10px; background:#666;'></span> +5% population</div>
<div><span style='padding:0px 10px; background:#999;'></span> +0% population</div>
<div><span style='padding:0px 10px; background:#ccc;'></span> -5% population</div>
grid.json
See utfgrid.md
for the format and storage of UTFGrid JSON.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
UTFGrid
The UTFGrid encoding scheme encodes interactivity data for a tile in a space efficient manner. It is designed to be used in browsers, e.g. for displaying tooltips when hovering over certain features of a map tile.
Since slower browsers and machines can't cope with rendering the actual polygons used to draw vectors on the map tile, we use a grid-based approach where we store the associated information for each pixel.
UTFGrid uses JSON as a container format. It is exclusively geared towards square tiles.
Grid
To achieve reasonable speed in browsers, we store information for a pixel in long strings, where each character's Unicode code point is the key for retrieving the information associated with that pixel. When we have less than 96 unique IDs, this means that the space taken up by storing each pixel separately is 256 * 256 = 64 KB. Gzipping the grid data typically reduces it to a size below 2K.
By default, UTFGrid operates on a 4x4 grid, meaning that a tile at zoom level 0 that contains the entire world in its extent will have an grid resolution of 64x64. We take advantage of UTF-8's variable length codepoint encoding: all ASCII characters are encoded as is, that means that the first 94 codepoints are encoded with their code number as a single byte (codes 0x20
,0x21
, 0x23
-0x5B
and 0x5D
-0x7F
). IDs with a number larger than that will get encoded as multiple bytes.
Encoding IDs
JSON doesn't allow control characters, "
and \
to be encoded as their literal UTF-8 representation. Encoding an ID works as follows:
- Add 3210.
- If the result is >= 3410, add 1.
- If the result is >= 9210, add 1.
This ensures that all characters that cannot be represented natively are skipped.
Decoding works as follows:
- If the codepoint is >= 9310, subtract 1.
- If the codepoint is >= 3510, subtract 1.
- Subtract 3210.
Mapping an ID to a key
The UTFgrid file contains an array in a property named grid
at the root level. Each entry represents a row in the grid. Each array entry is a string that contains the UTF-8 encoded codepoint for each column. The string length corresponds to the number of entries in the grid
array. Only powers of two are allowed.
The keys are stored in an array named keys
at the root level. The index of each key represents the ID that it is associated to.
Retrieving a key from a coordinate works as follows (json
is the root level object, x
and y
are the coordinates, starting from top left at 0, and size
is the number of entries in the grid
key):
var factor = 256 / size, row = y / factor, col = x / factor
var id = json.grid[row].charCodeAt(col);
is the character that contains the encoded ID.- Decode the id as described in "Encoding IDs".
var key = json.keys[id];
retrieves the ID associated with the coordinate.
All divisions are integer divisions.
Mapping a key to data
The JSON file may contain an optional data
property at the root level. If it isn't present, the client looks up the obtained key in its internal data store. If the lookup key is not present, it queries the server with the missing keys. If the data
property is present, but the key cannot be found, the client must behave as if there were no data
property.
An empty key signifies the unavailability of information for that pixel. No action may be taken to retrieve data for an empty (""
) key.
Example UTFGrid JSON file
{ "grid":
[ " !!!#########",
" !!!#########",
" !!!!#########",
" !!!##########",
" !! !!!##########",
" !!!#########",
" !!######### ",
" ! !!! ####### ",
" ### ",
" $ ",
" $$ %%",
" $$$$$$$%%",
" $$$$$$$%%",
" $$$$$$$$$%%",
" $$$$$$$$$$%%",
" $$$$$$$$$$$$%",
" $$$$$$$$$%%%%",
" $$$$$$$$$%%%%%",
" $$$$$$$$%%%%%%",
" $$$$$$$%%%%%%%",
" $$$$%%%%%%%%%%",
" $$$$%%%%%%%%%%%",
" # # # $$$$$%%%%%%%%%%%%",
" $$$$$$$%%%%%%%%%%%%",
" $$$&&&&'%%%%%%%%%%%",
" $$$$&&&&'''%%%%%%%%%",
" $$$$'''''''''%%%%%%%%",
" $$$$'''''''''''%%%%%%",
" $$$$&''''''''((((%%%%%",
" $$$&&''''''''(((((%%%%",
" $$$&&'''''''''(((((((%%",
" $$$&&''''''''''(((((((%",
" $$$&&&''''''''''((((((((",
" ''''''''''''''''((((((((",
" '''''''''''''''((((((((",
" '''''''''''''''((((((((",
" '''''''''''''''((((((((",
" '''''''''''''''((((((((",
" '''''''''''''''((((((((",
" ) '''''''''''''''((((((((",
" ***'''''''''''''(((((((",
" *****'''''''''''(((((((",
" )) ******'''(((((((((((((((",
" *******(((((((((((((((++",
" *******(((((((((((((++++",
" ********((((((((((((++++",
" ***,,-**((((((((((++++++",
" ,,,,-------(((((+++++++",
" ,,---------(((((+++++.+",
" --------(((((+++....",
" -///----0000000....",
" ////----0000000....",
" /////1---0000000...",
" ///11--0000000....",
" 111110000000....",
" 11110000000....",
" 1111000000....",
" 1100 . ",
" ",
" ",
" ",
" ",
" ",
" " ],
"keys":
[ "",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16" ],
"data":
{ "1": { "admin": "Portugal" },
"2": { "admin": "Spain" },
"3": { "admin": "Morocco" },
"4": { "admin": "Algeria" },
"5": { "admin": "Western Sahara" },
"6": { "admin": "Mauritania" },
"7": { "admin": "Mali" },
"8": { "admin": "Cape Verde" },
"9": { "admin": "Senegal" },
"10": { "admin": "Burkina Faso" },
"11": { "admin": "Guinea Bissau" },
"12": { "admin": "Guinea" },
"13": { "admin": "Ghana" },
"14": { "admin": "Sierra Leone" },
"15": { "admin": "Ivory Coast" },
"16": { "admin": "Liberia" } } }
To test implementations, demo.json
contains a grid that consists of 65501 different keys. This is the maximum possible in this version of UTFGrid. Implementors should check that obtaining a coordinate should return the key y * 256 + x
for all x/y, with the exception of y = 255 and x >= 222 and x <= 255 returning 65501 due to the maximum codepoint allowed in JSON.
A dummy code validation routine is given here:
var json = JSON.parse(/* demo.json */); // the resolution of the grid. adjust this for your grid.
var resolution = 4; var key = 0,
dimension = 256 / resolution; for (var y = 0; y < dimension; y++) {
for (var x = 0; x < dimension; x++) {
var code = json.grid[y].charCodeAt(x);
if (code >= 93) code--;
if (code >= 35) code--;
code -= 32; assert(code == key); if (key < 65501) key++;
}
}
UTFGrid的更多相关文章
- MBTiles
MBTiles Specification MBTiles is a specification for storing tiled map data in SQLite databases for ...
- SuperMap iClient 7C——网络客户端GIS开发平台 产品新特性
SuperMap iClient 7C是空间信息和服务的可视化交互开发平台,是SuperMap服务器系列产品的统一客户端.产品基于统一的架构体系,面向Web端和移动端提供了多种类型的SDK开发包,帮助 ...
- Exploring the MapBox stack: MBTiles, TileJSON, UTFGrids and Wax
转自:http://blog.thematicmapping.org/2012/11/exploring-mapbox-stack-mbtiles-tilejson.html In my last b ...
- Tilemill + tilestream + mapbox.js 自制地图
感谢Mapbox,带来了一整套完整的地图方案. 你可以把你的地图放在Mapbox的网站上.也可以使用他们提供的开源软件自己架设地图服务. Mapbox的地图方案包括web,ios和android. 不 ...
- SuperMap iClient
SuperMap iClient 7C——网络客户端GIS开发平台 产品新特性 SuperMap iClient 7C是空间信息和服务的可视化交互开发平台,是SuperMap服务器系列产品的统一客 ...
- leaflet地图库
an open-source JavaScript libraryfor mobile-friendly interactive maps Overview Tutorials Docs Downlo ...
- 可视化之Berkeley Earth
去年冬天雾霾严重的那几天,写了两篇关于空气质量的文章,<可视化之PM2.5>和<谈谈我对雾霾的认识>.坦白说,环境问题是一个无法逃避又无能为力的话题.最近因为工作中有一些数据可 ...
- openLayers 3知识回顾
openlayers 知识 前段时间帮助同事重构一个地图类的项目,然后就学习了openLayer3这个框架,但是官网上没有中文版,也没有详细的例子解释,我只能遇到看不懂的就翻译成中文来用,为了方便以后 ...
- ol图层支持的数据源
ol.source.BingMaps,必应地图的数据: ol.source.Cluster,聚族矢量数据: ol.source.ImageCanvas,数据来源是一个canvas元素,其中数据是图片: ...
随机推荐
- 基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(目录)
本系统文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以 SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...
- 修改Tomcat响应请求时返回的Server内容
HTTP Server在响应请求时,会返回服务器的Server信息,比如 Tomcat 7 的Header是: 这东西其实会给一些别有用心之人带来一定的提示作用:为安全起见,我们一般会建议去掉或修改这 ...
- C#对WebApi数据操作
目标 简化并统一程序获取WebApi对应实体数据的过程,方便对实体进行扩充.原理就是数据服务使用反射发现数据提供者,处理好泛型就行. 相关传送门:Restful WebApi开发实践 先来看下最后的请 ...
- CSharpGL(37)创建和使用VBO的最佳方式
CSharpGL(37)创建和使用VBO的最佳方式 开始 近日在OpenGL红宝书上看到这样的讲解. 其核心意思是,在创建VBO时用 glBufferData(GL_ARRAY_BUFFER, len ...
- ASP.net 使用ConfigurationManager获取连接字符串
在解决方案资源管理器里右键单击解决方案选择“添加引用”,并且从 .net 中找到 System.Configuration 引用它 在项目的web.config文件中添加 <connection ...
- Java 设计模式 —— 单例模式
1. 概念: 单例模式是一种常用的软件设计模式.核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果 ...
- [CentOs7]搭建ftp服务器(2)——添加用户
摘要 上篇文章完成了ftp服务器的安装与匿名访问的内容,当然出于安全的考虑是不允许匿名访问服务器的,所以就有了本篇的内容 ,为ftp服务器添加用户,用改用户进行访问. vsftpd添加用户 FTP用户 ...
- 【WPF】闲着没事,写了个支持数据列表分页的帮助类
支持分页的MVVM组件大家可以网上找,老周这个类只是没事写来娱乐一下的,主要是功能简单,轻量级,至少它满足了我的需求,也许还有未知的 bug . 这个类支持对数据列表进行分页处理,原理是利用 Skip ...
- 移动端HTML5音频与视频问题及解决方案
最近在研究用视频代替动画,用视频代替精灵动画,我们称这种视频叫做交互视频. 传统的精灵动画: 磁盘空间大,下载慢,尤其是在线播放,会更慢 文件太多,在线播放的时候,太多http请求,会导致响应慢,或者 ...
- fluent-ffmpeg 常用函数
最近项目频繁用到fluent-ffmpeg,将目前使用到的函数进行总结. 首先引入fluent-ffmpeg模块: var ffmpeg = require('fluent-ffmpeg'); 1.函 ...