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

简介: 阿里云瑶池数据库云原生化和一体化产品能力升级,多款产品更新迭代

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


《阿里云产品四月刊》—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>
相关文章
|
4月前
|
存储 设计模式 Java
重学Java基础篇—ThreadLocal深度解析与最佳实践
ThreadLocal 是一种实现线程隔离的机制,为每个线程创建独立变量副本,适用于数据库连接管理、用户会话信息存储等场景。
141 5
|
6月前
|
存储 人工智能 NoSQL
Tablestore深度解析:面向AI场景的结构化数据存储最佳实践
《Tablestore深度解析:面向AI场景的结构化数据存储最佳实践》由阿里云专家团队分享,涵盖Tablestore十年发展历程、AI时代多模态数据存储需求、VCU模式优化、向量检索发布及客户最佳实践等内容。Tablestore支持大规模在线数据存储,提供高性价比、高性能和高可用性,特别针对AI场景进行优化,满足结构化与非结构化数据的统一存储和高效检索需求。通过多元化索引和Serverless弹性VCU模式,助力企业实现低成本、灵活扩展的数据管理方案。
304 12
|
7月前
|
监控 数据管理 测试技术
API接口自动化测试深度解析与最佳实践指南
本文详细介绍了API接口自动化测试的重要性、核心概念及实施步骤,强调了从明确测试目标、选择合适工具、编写高质量测试用例到构建稳定测试环境、执行自动化测试、分析测试结果、回归测试及集成CI/CD流程的全过程,旨在为开发者提供一套全面的技术指南,确保API的高质量与稳定性。
|
7月前
|
Java 数据库连接 开发者
Java中的异常处理机制:深入解析与最佳实践####
本文旨在为Java开发者提供一份关于异常处理机制的全面指南,从基础概念到高级技巧,涵盖try-catch结构、自定义异常、异常链分析以及最佳实践策略。不同于传统的摘要概述,本文将以一个实际项目案例为线索,逐步揭示如何高效地管理运行时错误,提升代码的健壮性和可维护性。通过对比常见误区与优化方案,读者将获得编写更加健壮Java应用程序的实用知识。 --- ####
|
7月前
|
PHP 开发者 容器
PHP命名空间深度解析及其最佳实践####
本文深入探讨了PHP中引入命名空间的重要性与实用性,通过实例讲解了如何定义、使用及别名化命名空间,旨在帮助开发者有效避免代码冲突,提升项目的模块化与可维护性。同时,文章还涉及了PHP-FIG标准,引导读者遵循最佳实践,优化代码结构,促进团队协作效率。 ####
93 1
|
8月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
215 2
|
4月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
408 29
|
4月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
124 4
|
4月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
4月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。

热门文章

最新文章

推荐镜像

更多
  • DNS