《阿里云产品四月刊》—Ganos H3 地理网格能力解析与最佳实践(3)

本文涉及的产品
云解析DNS-重点域名监控,免费拨测 20万次(价值200元)
简介: 阿里云瑶池数据库云原生化和一体化产品能力升级,多款产品更新迭代

本文来源于阿里云社区电子书《阿里云产品四月刊》


《阿里云产品四月刊》—Ganos H3 地理网格能力解析与最佳实践(2)https://developer.aliyun.com/article/1554159

附录

可视化前端 Python 脚本如下:

from quart import Quart, send file, render template
import asyncpg
import io
import re
# 数据库连接参数
CONNECTION = {"host": "YOUR HOST NAME OR IP", "port": PORT NO,
"database": "DATABASE NAME",
"user": "USER NAME", "password": "PASSWORD"}
# 目标表名/字段/ID
TABLE = "h3 count lev13"
H3 COL = "h3 lev13"
H3 GEOM COL = "geometry"
AGG VAL COL = "count"
COL SRID = 4326
app = Quart( name , template folder='./')
@app.before serving
async def create db pool():
app.db pool = await asyncpg.create pool(**CONNECTION)
@app.after serving
async def close db pool():
await app.db pool.close()
@app.route("/")
async def home():
sql = f'''
SELECT ST Extent(ST Transform(ST Envelope({H3 GEOM COL}), 4326))
FROM {TABLE};
'''
async with app.db pool.acquire() as connection:
box = await connection.fetchval(sql)
box = re.findall('BOX\((.*?) (.*?),(.*?) (.*?)\)', box)[0]
min x, min y, max x, max y = list(map(float, box))
bounds = [[min x, min y], [max x, max y]]
center = [(min x + max x) / 2, (min y + max y) / 2]
return await render template('./index.html', center=str(center),
bounds=str(bounds))
@app.route("/h3 mvt/<int:z>/<int:x>/<int:y>")
async def h3 mvt(z, x, y):
sql = f'''
SELECT ST AsMVT(tile.*)
FROM
(SELECT
ST AsMVTGeom({H3 COL},
ST Transform(ST TileEnvelope($1,$2,$3),{COL SRID}), 4096, 512, true)
geometry,
{AGG VAL COL} count
FROM {TABLE}
WHERE
({H3 COL}
&&
ST Transform(ST TileEnvelope($1,$2,$3),{COL SRID}))) tile'''
async with app.db pool.acquire() as connection:
tile = await connection.fetchval(sql, z, x, y)
return await send file(io.BytesIO(tile),
mimetype='application/vnd.mapbox vector tile')
if name == " main ":
app.run(port=5100)


index.html 文件内容如下:

 

<!DOCTYPE html>
<html>
<head>
<meta charset="utf 8">
<title>map viewer</title>
<meta
name="viewport"
content="initial scale=1,maximum scale=1,user scalable=no">
<link
href="https://api.mapbox.com/mapbox gl js/v2.14.1/mapbox gl.css"
rel="stylesheet">
<script
src="https://api.mapbox.com/mapbox gl js/v2.14.1/mapbox gl.js"></scr
ipt>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/chroma js/2.4.2/chroma.m
in.js"></script>
</head>
<body>
<div id="map" style="position: absolute;left:0; top: 0; bottom: 0;
width: 100%;cursor:pointer;"></div>
<div class="counter"
style="position:
absolute;left:2%;font size:
20px;padding: .1em .1em;text shadow: 3px 3px 3px black;">
<span>当前网格计数:</span><span id="count">0</span>
</div>
<script>
let YOUR TOKEN = "input your mapbox token"
mapboxgl.accessToken = YOUR TOKEN;
const map = new mapboxgl.Map({
container: "map",
style: "mapbox://styles/mapbox/navigation night v1",
center: {{ center }},
zoom: 1
})
map.on("load", () => {
map.fitBounds({{ bounds }})
map.on('mousemove', 'h3', (e) => {
map.getCanvas().style.cursor = "default";
if (e.features.length > 0)
document.getElementById('count').innerText =
e.features[0].properties.count
})
map.on('mouseleave', 'h3', () => {
map.getCanvas().style.cursor = "grab";
document.getElementById('count').innerText = 0
})
map.addSource("h3 source", {
type: "vector",
tiles: [`${window.location.href}h3 mvt/{z}/{x}/{y}`],
tileSize: 512
});
// make color map
const MIN = 1
const MAX = 600
const STEP = 10
color map = chroma.scale(["#536edb", "#5d96a5", "#68be70",
"#91d54d", "#cddf37", "#fede28", "#fda938", "#fb7447", "#f75a40",
"#f24734", "#e9352a", "#da2723", "#cb181d"])
.domain([MIN, MAX]);
let colors = []
for (let i = MIN; i < MAX; i += STEP)
colors.push(color map(i).hex(), i)
colors.push(color map(MAX).hex())
map.addLayer({
id: "h3",
type: "fill",
source: "h3 source",
"source layer": "default",
paint: {
"fill color": [
"step", ["get", "count"],
...colors
],
"fill opacity": 0.8
}
});
});
</script>
</body>
</html>
相关文章
|
9月前
|
存储 设计模式 Java
重学Java基础篇—ThreadLocal深度解析与最佳实践
ThreadLocal 是一种实现线程隔离的机制,为每个线程创建独立变量副本,适用于数据库连接管理、用户会话信息存储等场景。
294 5
|
10月前
|
弹性计算 运维 网络安全
阿里云轻量应用服务器产品解析与搭建个人博客网站教程参考
轻量应用服务器(Simple Application Server)作为阿里云面向单机应用场景推出的云服务器产品,以其一键部署、一站式管理、高性价比等特性,深受个人开发者、中小企业及入门级用户的喜爱。本文将全面解析阿里云轻量应用服务器的产品优势、应用场景、使用须知,以及使用轻量应用服务器搭建个人博客网站的详细教程,帮助用户更好地了解和使用这一产品。
|
11月前
|
存储 人工智能 NoSQL
Tablestore深度解析:面向AI场景的结构化数据存储最佳实践
《Tablestore深度解析:面向AI场景的结构化数据存储最佳实践》由阿里云专家团队分享,涵盖Tablestore十年发展历程、AI时代多模态数据存储需求、VCU模式优化、向量检索发布及客户最佳实践等内容。Tablestore支持大规模在线数据存储,提供高性价比、高性能和高可用性,特别针对AI场景进行优化,满足结构化与非结构化数据的统一存储和高效检索需求。通过多元化索引和Serverless弹性VCU模式,助力企业实现低成本、灵活扩展的数据管理方案。
585 12
|
12月前
|
缓存 网络协议 安全
融合DNS技术产品和生态
本文介绍了阿里云在互联网基础资源领域的最新进展和解决方案,重点围绕共筑韧性寻址、赋能新质生产展开。随着应用规模的增长,基础服务的韧性变得尤为重要。阿里云作为互联网资源的践行者,致力于推动互联网基础资源技术研究和自主创新,打造更韧性的寻址基础服务。文章还详细介绍了浙江省IPv6创新实验室的成立背景与工作进展,以及阿里云在IPv6规模化部署、DNS产品能力升级等方面的成果。此外,阿里云通过端云融合场景下的企业级DNS服务,帮助企业构建稳定安全的DNS系统,确保企业在数字世界中的稳定运行。最后,文章强调了全链路极致高可用的企业DNS解决方案,为全球互联网基础资源的创新提供了中国标准和数字化解决方案。
|
12月前
|
存储 搜索推荐 数据挖掘
投资回报与预算考量:CRM产品报价全解析
在当今竞争激烈的商业环境中,CRM系统已成为企业不可或缺的工具。它能有效管理客户信息、提升销售效率、优化服务并增强忠诚度。选择合适的CRM需考虑功能、用户数量、定制需求、技术支持及数据安全等因素,确保在预算内实现最大价值。企业在挑选时应明确需求、比较产品、评估长期回报,并考虑扩展性。最适合自己业务需求的CRM才是最佳选择。
|
12月前
|
监控 数据管理 测试技术
API接口自动化测试深度解析与最佳实践指南
本文详细介绍了API接口自动化测试的重要性、核心概念及实施步骤,强调了从明确测试目标、选择合适工具、编写高质量测试用例到构建稳定测试环境、执行自动化测试、分析测试结果、回归测试及集成CI/CD流程的全过程,旨在为开发者提供一套全面的技术指南,确保API的高质量与稳定性。
|
12月前
|
PHP 开发者 容器
PHP命名空间深度解析及其最佳实践####
本文深入探讨了PHP中引入命名空间的重要性与实用性,通过实例讲解了如何定义、使用及别名化命名空间,旨在帮助开发者有效避免代码冲突,提升项目的模块化与可维护性。同时,文章还涉及了PHP-FIG标准,引导读者遵循最佳实践,优化代码结构,促进团队协作效率。 ####
165 1
|
9月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
848 29
|
9月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
346 4
|
9月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

推荐镜像

更多
  • DNS