Projection

该接口提供三个函数

//实现像素点到经纬度的转换

GeoPoint fromPixels(int x, int y);  

//实现经纬度到屏幕坐标的转换

Point toPixels(GeoPoint in, Point out);

/**
     * 将以米为计量单位的距离(沿赤道)在当前缩放水平下转换到一个以像素(水平)为计量单位的距离。在默认的Mercator投影变换下,对于给定的距离,
     * 当远离赤道时,变换转换后的像素数量会增加,即得到的距离为一个近似值
   */
  float metersToEquatorPixels(float meters);


这个接口的实现在MapView里,具体转换依赖当时的比例尺,

fromPixels,先转成在真张大图中的坐标,然后在转换成经纬度坐标

toPixels, 先将经纬度装成在真张大图中的坐标,然后减去相对于屏幕起点的坐标,即可得到相对于屏幕的坐标值






ClickHouse 中的 projection(投影)功能是用于进一步优化查询性能的一种机制,尤其在处理大规模数据时效果显著。Projection 的基本思想是预先计算和存储某些列组合的聚合值,以在查询时快速获取结果,避免全表扫描[^1]。以下是关于 ClickHouse 25 中 projection 的配置与使用方法的详细介绍: ### 创建表时定义 Projection Projection 是在创建表时通过 `PROJECTION` 子句定义的,通常与 `MergeTree` 系列引擎结合使用。以下是一个定义 projection 的示例: ```sql CREATE TABLE example_table ( ID UInt64, EventDate Date, UserID UInt64, CounterID UInt64, Value Float64, PROJECTION example_projection ( SELECT CounterID, sum(Value) GROUP BY CounterID ) ) ENGINE = MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) ``` 在此示例中,`example_projection` 是一个 projection,它会预先计算并存储 `CounterID` 与 `sum(Value)` 的聚合结果。这在需要频繁查询 `CounterID` 的聚合值时可以显著提高查询效率[^1]。 ### 查询时自动使用 Projection ClickHouse 的查询优化器会自动决定是否使用已定义的 projection 来加速查询。例如,如果有一个查询如下: ```sql SELECT CounterID, sum(Value) FROM example_table GROUP BY CounterID ``` 查询优化器会检测到 `example_projection` 能够满足此查询的需求,并自动使用该 projection 来减少计算量和 I/O 开销[^1]。 ### 管理 Projection Projection 可以被添加或删除,但目前不支持直接修改已有的 projection。以下是添加 projection 的示例: ```sql ALTER TABLE example_table ADD PROJECTION example_projection ( SELECT CounterID, sum(Value) GROUP BY CounterID ) ``` 删除 projection 的语法如下: ```sql ALTER TABLE example_table DROP PROJECTION example_projection ``` 这些操作允许用户根据实际查询需求动态调整 projection 的配置,以保持查询性能的优化。 ### Projection 的存储与维护 Projection 数据是存储在磁盘上的,并且会随着主表数据的更新而自动维护。当主表数据发生变化时,相关的 projection 数据也会被重新计算和更新,以确保查询结果的准确性。Projection 的存储结构与主表类似,但仅包含 projection 定义中的列和聚合值。 ### 性能优化建议 1. **合理选择 Projection 的列和聚合函数**:Projection 的设计应基于常见的查询模式。选择频繁查询的列和常用的聚合函数(如 `sum`、`count`、`avg`)可以最大化 projection 的效用。 2. **避免过度定义 Projection**:虽然 projection 可以提升查询性能,但过多的 projection 会增加存储开销和数据更新的复杂性。因此,应根据实际需求平衡查询性能和存储成本。 3. **定期监控 Projection 的使用情况**:通过分析查询日志和性能指标,确保 projection 的使用符合预期,并根据需要调整 projection 的配置。 ### 示例代码 以下是一个完整的示例,展示如何创建表并定义 projection,以及如何执行查询: ```sql -- 创建表并定义 projection CREATE TABLE example_table ( ID UInt64, EventDate Date, UserID UInt64, CounterID UInt64, Value Float64, PROJECTION example_projection ( SELECT CounterID, sum(Value) GROUP BY CounterID ) ) ENGINE = MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)); -- 插入测试数据 INSERT INTO example_table (ID, EventDate, UserID, CounterID, Value) VALUES (1, '2023-01-01', 1001, 101, 10.5), (2, '2023-01-01', 1002, 102, 20.3); -- 执行查询 SELECT CounterID, sum(Value) FROM example_table GROUP BY CounterID; ``` ### 总结 Projection 是 ClickHouse 中一种强大的性能优化工具,通过预先计算和存储聚合结果,显著减少了查询时的计算量和 I/O 开销。合理配置和管理 projection 可以帮助用户在处理大规模数据时实现高效的查询性能[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值