From 6df0ea83bb6362862e7c23c5a3bde3a04b1e9a6d Mon Sep 17 00:00:00 2001 From: baol Date: Thu, 14 Nov 2024 20:40:15 +0800 Subject: [PATCH] add feature --- __pycache__/color.cpython-310.pyc | Bin 0 -> 2540 bytes color.py | 97 ++++++++++++++++++++++++++++++ main.py | 16 ++++- prompt.txt | 27 ++++++++- 4 files changed, 137 insertions(+), 3 deletions(-) create mode 100644 __pycache__/color.cpython-310.pyc create mode 100644 color.py diff --git a/__pycache__/color.cpython-310.pyc b/__pycache__/color.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c57189b634e1a81c300391793fe21255d7b6cad GIT binary patch literal 2540 zcmb7G-)~b@96vwqZST6Z8`~HiC|MA2jb+2dJ-93r3<>eY5N3R+VpDq0YFT?*&b=jU zxl2g8Ns0VYMqvj=J%YtADuxGPjkQL*Y|vX zf6i$k91bC9Gk^7GerrVNPdTY?a`zB?_7fl`GI0(iF!Urx@-#v7T0+DAx}MNY%J8Xx zsWHle%orh^Xhbu0Gcc(o8q6RInTFcYU|0P{G~fU(II(ptU^bW`IMv9S%*Ii|&zMb# zuo+H7%t)fyY)-T=JiCpBS#uj=5k*^WQnQ6M??P=T(aIWFYZ)inSUb~ax3jjJxQsD^ zS);j)wUx=nEWBmbx;``UFnBtQVr@0>8oe7MLOYU8J3@c2RLn8abS9Nc+U#_RS!pH$ zoH-?KrLp8)YXRtk@KN~e?}0dI7Q5&soBizcW;Trkn44s|panY0s? zVLpf)-PD|b3o}!TqB1#xPVAY`+`6@0=mI*AMz9LA;RIdm63JJ_6FNxMH>J7|Y+vf> zy|4p8*w7bT-*G88ZIs>wS3+ITyvmHXxKO+G)yjoms`FR9D>te)X1#lpaev7>_i*K6 z*_*k)G{120Kwp1yS<8ucIWm7I2D)m~cR_o-G2Ye7%U@1z$m{kki^aia$@$X*Z($l3 zjvsyd@S5{eWw4{W&exbSdrsrB5)`Se%8@JtSe4!8*5C)4)X?JpTmNJyD=(A&q0At3d~_i=P4&! zm_vW>@8yMp(_7?)Q!MS+y?qD!-st7oGmIawv-#e1Ay?o%#W4{Ylo?DH^2MP&Ak`*7 zy3zRSY0gp(ODeu(hNsLdvz%l;RV-$$OwVAhkWS_7AsDQmuB}3g8G=|vp{F=cjR{?4 z0&FUjEK}$sxk3uy#Zy*>37TV;pySzMEWkC;DYTQh5-f9OO0e0boFi~ngwrL?rDkOa zm%-xOBx#ptUVfpKGP-sLkWiyR4Xn{9?Vv3rN_LVc)d=4!Md(m{pf~J0y5?V6Mq$0l zlu8Q~%qL+`!6qKXJYYgHU`$7K-ehXS0RQuN9i%Rn@C1Mo2dmW}+>pk`DwPoKL;!OD zDD-*-=27HQNjKnb$TI+A4Iu8rJ>XC`P?on=L+L4)qKdIP`=EO1?#iPt0B*9p&pnJU zEnZ#&w1TpC=ejpFzchcR`pxa?g-08O?(?hxdU@e-_1w4BE1!da7lO6K2D*H0l2amB zwk-h!@cH*io%;X4t-5V};41X469DkPaj10FhBY-Vgye;;!Qwe)OSzMr_LtRLeFQd zWZH+(R>|)Gvn>M}KmpRR8d!~Kg2EvnS&Q$M@;arwpdY0DFcv{6bd-(30L1zOSb?zk zD=^@%$dgi4jPO=DRxwr(Zhu}lrE~U9AVyfjfLz=`I;g~O3l33(1fCfh?}u$+B;iT| zwMqV}6zgB3Fhc0}w`$5ac~xfa9{ppy{iF8})%su->kztnWcUu4iGVXEuQV>x%ViLS zcFHbTB50ZF7UNK4zT4`;;Jf5>UAYC1Su!c~vq^AXbr39^64(+(E^FDv6#RFfG6X7C zdXYnU3*Ce_&fYA)&HM^uFkdiBIW{EU3%du1fm$F0FHy3eV6xf)Uxb978T&M%L0~kz P8yhr2A~b?qvG(L2%xcvO literal 0 HcmV?d00001 diff --git a/color.py b/color.py new file mode 100644 index 0000000..a5f7588 --- /dev/null +++ b/color.py @@ -0,0 +1,97 @@ +import numpy as np +from typing import Dict, Tuple +import json + + +def create_color_gradient_mapping(val_sequence: np.ndarray) -> Dict[int, tuple]: + """ + 创建颜色渐变映射,颜色值范围为0-255,使用Python list类型,分界值四舍五入为整数 + + Parameters: + val_sequence: numpy数组,包含分界值序列 + + Returns: + Dict[int, tuple]: 键为四舍五入后的分界值(整数),值为对应的RGBA颜色元组(Python list) + """ + # 确保输入是numpy数组 + val_sequence = np.array(val_sequence) + + # 定义基础颜色 (蓝色到红色),使用0-255格式和Python list类型 + blue = [0, 0, 255, 255] # 起始蓝色 (R,G,B,A) + red = [255, 0, 0, 255] # 结束红色 (R,G,B,A) + + # 创建结果字典 + result = {} + + # 添加第一个元素(纯蓝色) + result[round(float(val_sequence[0]))] = tuple(blue) + + # 为中间值生成渐变色 + for i in range(1, len(val_sequence) - 1): + # 计算当前位置的比例 + ratio = i / (len(val_sequence) - 1) + # 线性插值计算当前颜色 + current_color = [int(b * (1 - ratio) + r * ratio) for b, r in zip(blue, red)] + + result[round(float(val_sequence[i]))] = tuple(current_color) + + # 添加最后一个元素(纯红色) + result[round(float(val_sequence[-1]))] = tuple(red) + + return result + + +def get_color_from_value( + value: float, color_mapping: Dict[int, Tuple[int, int, int, int]] +) -> Tuple[int, int, int, int]: + """ + 根据输入的值,从颜色映射字典中查找对应的颜色,使用线性插值 + + Parameters: + value: 输入值 + color_mapping: 颜色映射字典 + + Returns: + Tuple[int, int, int, int]: RGBA颜色元组 + """ + if value <= 10: + return (0, 0, 255, 255) + if value >= 3500: + return (255, 0, 0, 255) + # 找到小于等于输入值的最大分界值 + max_key = max([k for k in color_mapping if k <= value]) + + # 找到大于输入值的最小分界值 + min_key = min([k for k in color_mapping if k > value]) + + # 计算当前值在两个分界值之间的比例 + max_val = color_mapping[max_key] + min_val = color_mapping[min_key] + ratio = (value - max_key) / (min_key - max_key) + + # 线性插值计算颜色 + current_color = [ + int(max_c * (1 - ratio) + min_c * ratio) + for max_c, min_c in zip(max_val, min_val) + ] + return tuple(current_color) + + +# 使用示例: +if __name__ == "__main__": + # 生成原始序列 + x_min = 10 + x_max = 3500 + a = 0.25 + n = 19 + val = (np.linspace((x_min**a), (x_max**a), n)) ** (1 / a) + + # 生成颜色映射 + color_mapping = create_color_gradient_mapping(val) + + print(json.dumps(color_mapping)) + + # 使用get_color_from_value()方法查找颜色 + print(get_color_from_value(89.47, color_mapping)) # (15, 0, 240, 255) + print(get_color_from_value(3500, color_mapping)) # (255, 0, 0, 255) + print(get_color_from_value(50, color_mapping)) # (64, 0, 191, 255) diff --git a/main.py b/main.py index e693533..a6644a4 100644 --- a/main.py +++ b/main.py @@ -6,6 +6,17 @@ import json from datetime import datetime, timedelta import numpy as np from shapely.geometry import mapping +from color import create_color_gradient_mapping, get_color_from_value + + +x_min = 10 +x_max = 3500 +a = 0.25 +n = 19 +val = (np.linspace((x_min**a), (x_max**a), n)) ** (1 / a) + +# 生成颜色映射 +color_mapping = create_color_gradient_mapping(val) def convert_coordinates(coord_list): @@ -133,8 +144,9 @@ def generate_river_czml(river_df, runoff_df, level=4, start_time=None): for hour, runoff in enumerate(river_runoff): time_offset = hour * 3600 # 转换为秒 - color = get_color(runoff, 0, max_runoff) - color_property["rgba"].extend([time_offset] + color) + print("runoff", runoff) + color = get_color_from_value(abs(runoff), color_mapping) + color_property["rgba"].extend([time_offset] + list(color)) # 创建河段实体 entity = { diff --git a/prompt.txt b/prompt.txt index 97a47a1..e9821e2 100644 --- a/prompt.txt +++ b/prompt.txt @@ -71,4 +71,29 @@ 河段的颜色从蓝到红,径流小时用蓝色表示,大时用红色表示。 [object] -请给出生成czml的python代码 \ No newline at end of file +请给出生成czml的python代码 + + +======================================================================= + +[context] +我有一个幂次序列,是有如下代码生成的: + +CODE``` +import numpy as np + +min=10 +max=3500 +a = 0.25 +n = 19 +val = (np.linspace((xmin ** a), (3500 ** a), n)) ** (1 / a) +``` + +[object] +请根据这个序列,生成颜色区间 + +颜色区间由蓝色渐变为红色 + +小于val中第一元素值的为蓝色,大于val中最后一个元素值的为红色。 + +请用python实现,该方法返回一组列表,列表中的元素包含了两个属性,value和rgba \ No newline at end of file