waterqsvg


Namewaterqsvg JSON
Version 1.0.2 PyPI version JSON
download
home_pageNone
Summary专用于从水质监测数据生成SVG热力图的独立Python库
upload_time2025-07-09 05:43:34
maintainerNone
docs_urlNone
authorNone
requires_python>=3.11
licenseNone
keywords water-quality svg heatmap environmental monitoring
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # WaterQSVG

🌊 专用于从OSS数据生成水质SVG热力图的精简Python工具

## 🚀 项目简介

WaterQSVG (Water Quality SVG Generator) 是一个专门用于处理OSS水质监测数据并生成高质量SVG热力图的工具。支持从OSS ZIP文件下载、解析INDEXS.CSV+POS.TXT格式数据、使用增强插值算法生成平滑热力图,并输出精确的地理边界信息用于地图叠加。

### ✨ 核心特性

- 🔗 **OSS直连下载**:直接从阿里云OSS下载ZIP数据包
- 📋 **标准格式解析**:支持INDEXS.CSV + POS.TXT格式数据
- 🧮 **增强插值算法**:Alpha Shape边界检测 + 高分辨率插值
- 🎨 **SVG矢量输出**:透明背景,适合地图叠加
- 📍 **地理边界信息**:输出精确的经纬度坐标用于地图定位
- 🔄 **批量处理**:自动识别并处理所有可用指标

## 📦 安装方法

### 使用uv安装(推荐)

```bash
# 克隆项目
git clone <repository-url>
cd waterqsvg

# 初始化uv项目
uv init

# 安装依赖
uv add numpy pandas matplotlib scipy requests pillow chardet python-dotenv
```

### 传统pip安装

```bash
# 安装依赖
pip install -r requirements.txt

# 安装项目
pip install -e .
```

### 从PyPI安装(发布后)

```bash
# 使用pip安装
pip install waterqsvg

# 使用uv安装
uv add waterqsvg
```

## 🎯 快速开始

### 基本使用

```python
from waterqsvg import WaterQualityProcessor

# OSS ZIP文件URL
oss_zip_url = "https://your-oss-bucket.oss-cn-shanghai.aliyuncs.com/data.zip"

# 使用处理器
with WaterQualityProcessor(
    output_dir="./outputs",
    grid_resolution=400
) as processor:
    
    # 处理数据并生成SVG
    results = processor.process_from_oss_zip(
        zip_url=oss_zip_url,
        colormap="jet",
        boundary_method="alpha_shape",
        interpolation_method="linear",
        transparent_bg=True
    )
    
    # 查看结果
    for indicator, result in results.items():
        if result:
            print(f"指标: {result['indicator_name']}")
            print(f"SVG文件: {result['svg_path']}")
            print(f"边界文件: {result['bounds_path']}")
```

### 命令行使用

```bash
# 使用waterqsvg命令(安装包后可用)
waterqsvg --zip-url "https://example.com/data.zip" --output-dir "./outputs"

# 使用JSON配置文件
waterqsvg --zip-url "/path/to/config.json" --colormap "water_quality" --resolution 600

# 使用标准输入传递URL(推荐用于复杂URL)
echo "https://example.com/data.zip" | waterqsvg --output-dir "./outputs"
echo "/path/to/config.json" | waterqsvg

# 兼容的interface.py方式(开发模式)
python interface.py --zip-url "https://example.com/data.zip" --output-dir "./outputs"
```

### 运行示例

```bash
# 使用uv运行开发版本
uv run waterqsvg --zip-url "https://example.com/data.zip"

# 运行使用示例
uv run python example_usage.py
```

## 📊 支持的水质指标

自动识别并处理以下指标:

| 指标代码 | 中文名称 | 英文名称 | 单位 |
|---------|---------|----------|------|
| cod | 化学需氧量 | Chemical Oxygen Demand | mg/L |
| nh3n | 氨氮 | Ammonia Nitrogen | mg/L |
| tp | 总磷 | Total Phosphorus | mg/L |
| tn | 总氮 | Total Nitrogen | mg/L |
| chla | 叶绿素a | Chlorophyll-a | μg/L |
| cod_mn | 高锰酸盐指数 | COD Permanganate | mg/L |
| ss | 总悬浮物 | Total Suspended Solids | mg/L |
| bga | 蓝绿藻 | Blue-Green Algae | 细胞/mL |

## 🗂️ 数据格式要求

### 输入数据结构

ZIP文件必须包含:
- `INDEXS.csv` - 水质指标数据
- `POS.txt` - GPS坐标数据

#### INDEXS.csv 格式示例
```csv
number,CHLa,Turbidity,SS,COD,TP,NH3-N,Bga,CODMn,TN
1,6.646,10.689,10.635,9.053,0.066,0.127,6.034,3.174,0.471
2,6.427,11.098,11.172,9.030,0.063,0.123,2.686,3.121,0.463
```

#### POS.txt 格式示例
```
/path/file_1.csv latitude: 31.516106 longitude: 120.267944 height: 110.27
/path/file_2.csv latitude: 31.516125 longitude: 120.267938 height: 110.26
```

## 📂 输出文件

每个水质指标生成两个文件:

### 1. SVG热力图文件
- 文件名:`{指标}_heatmap.svg`
- 格式:矢量SVG,透明背景
- 用途:直接叠加到地图上

### 2. 地理边界JSON文件
- 文件名:`{指标}_bounds.json`
- 内容:精确的经纬度边界信息
- 用途:地图定位和叠加

#### 边界文件示例
```json
{
  "geographic_bounds": {
    "min_longitude": 120.264922,
    "max_longitude": 120.267936,
    "min_latitude": 31.515932,
    "max_latitude": 31.520750,
    "center_longitude": 120.266429,
    "center_latitude": 31.518341
  },
  "grid_info": {
    "grid_resolution": 400,
    "valid_pixels": 83583
  },
  "projection_info": {
    "coordinate_system": "WGS84",
    "units": "degrees"
  }
}
```

## 🎨 配置选项

### 颜色映射
- `jet` - 彩虹色映射(默认)
- `water_quality` - 专业水质色彩
- `viridis` - 感知均匀色彩
- `RdYlBu_r` - 红-黄-蓝反向

### 边界检测方法
- `alpha_shape` - Alpha Shape算法(默认,高精度)
- `convex_hull` - 凸包算法(快速)
- `density_based` - 密度边界检测

### 插值方法
- `linear` - 线性插值(默认)
- `cubic` - 三次插值(更平滑)
- `nearest` - 最近邻插值

## 🏗️ 项目结构

```
svg-water-quality-generator/
├── water_quality_processor.py    # 主处理脚本
├── example_usage.py             # 使用示例
├── src/                         # 核心模块
│   ├── core/                    # 核心功能
│   │   ├── downloader.py        # OSS下载器
│   │   └── extractor.py         # ZIP解压器
│   ├── data/                    # 数据处理
│   │   ├── parser.py            # 数据解析器
│   │   ├── standardizer.py      # 数据标准化
│   │   └── validator.py         # 数据验证
│   ├── interpolation/           # 插值算法
│   │   ├── alpha_shape.py       # Alpha Shape
│   │   ├── convex_hull.py       # 凸包算法
│   │   ├── density_boundary.py  # 密度边界
│   │   └── enhanced_interpolation.py # 增强插值
│   ├── visualization/           # 可视化
│   │   ├── svg_generator.py     # SVG生成器
│   │   ├── color_mapper.py      # 颜色映射
│   │   └── layout_calculator.py # 布局计算
│   ├── config/                  # 配置
│   │   └── indicators.py        # 指标配置
│   └── utils/                   # 工具
│       └── logger.py            # 日志工具
└── tests/                       # 测试
    └── test_basic_functionality.py
```

## 🚀 地图叠加示例

生成的SVG和边界信息可以直接用于Web地图:

### Leaflet.js 示例
```javascript
// 读取边界信息
const bounds = L.latLngBounds(
  [31.515932, 120.264922],  // 西南角
  [31.520750, 120.267936]   // 东北角
);

// 叠加SVG图像
const overlay = L.imageOverlay('cod_heatmap.svg', bounds, {
  opacity: 0.7,
  interactive: false
});

overlay.addTo(map);
```

## 🛠️ 开发环境

### 运行测试
```bash
uv run python tests/test_basic_functionality.py
```

### 代码格式化
```bash
black src/ tests/ *.py
flake8 src/ tests/ *.py
```

## 📝 版本信息

- **当前版本**: 1.0.0
- **Python要求**: >= 3.8
- **主要依赖**: numpy, pandas, matplotlib, scipy

## 🤝 贡献

欢迎提交Issue和Pull Request来改进这个项目。

## 📄 许可证

MIT License - 查看 [LICENSE](LICENSE) 文件了解详情。

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "waterqsvg",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.11",
    "maintainer_email": null,
    "keywords": "water-quality, svg, heatmap, environmental, monitoring",
    "author": null,
    "author_email": "Water Quality Monitoring Team <team@example.com>",
    "download_url": "https://files.pythonhosted.org/packages/02/4a/30bb5564e5dd768ac4f0b6b0e67faece598cdec74f3051d4301b5737e1f3/waterqsvg-1.0.2.tar.gz",
    "platform": null,
    "description": "# WaterQSVG\n\n\ud83c\udf0a \u4e13\u7528\u4e8e\u4eceOSS\u6570\u636e\u751f\u6210\u6c34\u8d28SVG\u70ed\u529b\u56fe\u7684\u7cbe\u7b80Python\u5de5\u5177\n\n## \ud83d\ude80 \u9879\u76ee\u7b80\u4ecb\n\nWaterQSVG (Water Quality SVG Generator) \u662f\u4e00\u4e2a\u4e13\u95e8\u7528\u4e8e\u5904\u7406OSS\u6c34\u8d28\u76d1\u6d4b\u6570\u636e\u5e76\u751f\u6210\u9ad8\u8d28\u91cfSVG\u70ed\u529b\u56fe\u7684\u5de5\u5177\u3002\u652f\u6301\u4eceOSS ZIP\u6587\u4ef6\u4e0b\u8f7d\u3001\u89e3\u6790INDEXS.CSV+POS.TXT\u683c\u5f0f\u6570\u636e\u3001\u4f7f\u7528\u589e\u5f3a\u63d2\u503c\u7b97\u6cd5\u751f\u6210\u5e73\u6ed1\u70ed\u529b\u56fe\uff0c\u5e76\u8f93\u51fa\u7cbe\u786e\u7684\u5730\u7406\u8fb9\u754c\u4fe1\u606f\u7528\u4e8e\u5730\u56fe\u53e0\u52a0\u3002\n\n### \u2728 \u6838\u5fc3\u7279\u6027\n\n- \ud83d\udd17 **OSS\u76f4\u8fde\u4e0b\u8f7d**\uff1a\u76f4\u63a5\u4ece\u963f\u91cc\u4e91OSS\u4e0b\u8f7dZIP\u6570\u636e\u5305\n- \ud83d\udccb **\u6807\u51c6\u683c\u5f0f\u89e3\u6790**\uff1a\u652f\u6301INDEXS.CSV + POS.TXT\u683c\u5f0f\u6570\u636e\n- \ud83e\uddee **\u589e\u5f3a\u63d2\u503c\u7b97\u6cd5**\uff1aAlpha Shape\u8fb9\u754c\u68c0\u6d4b + \u9ad8\u5206\u8fa8\u7387\u63d2\u503c\n- \ud83c\udfa8 **SVG\u77e2\u91cf\u8f93\u51fa**\uff1a\u900f\u660e\u80cc\u666f\uff0c\u9002\u5408\u5730\u56fe\u53e0\u52a0\n- \ud83d\udccd **\u5730\u7406\u8fb9\u754c\u4fe1\u606f**\uff1a\u8f93\u51fa\u7cbe\u786e\u7684\u7ecf\u7eac\u5ea6\u5750\u6807\u7528\u4e8e\u5730\u56fe\u5b9a\u4f4d\n- \ud83d\udd04 **\u6279\u91cf\u5904\u7406**\uff1a\u81ea\u52a8\u8bc6\u522b\u5e76\u5904\u7406\u6240\u6709\u53ef\u7528\u6307\u6807\n\n## \ud83d\udce6 \u5b89\u88c5\u65b9\u6cd5\n\n### \u4f7f\u7528uv\u5b89\u88c5\uff08\u63a8\u8350\uff09\n\n```bash\n# \u514b\u9686\u9879\u76ee\ngit clone <repository-url>\ncd waterqsvg\n\n# \u521d\u59cb\u5316uv\u9879\u76ee\nuv init\n\n# \u5b89\u88c5\u4f9d\u8d56\nuv add numpy pandas matplotlib scipy requests pillow chardet python-dotenv\n```\n\n### \u4f20\u7edfpip\u5b89\u88c5\n\n```bash\n# \u5b89\u88c5\u4f9d\u8d56\npip install -r requirements.txt\n\n# \u5b89\u88c5\u9879\u76ee\npip install -e .\n```\n\n### \u4ecePyPI\u5b89\u88c5\uff08\u53d1\u5e03\u540e\uff09\n\n```bash\n# \u4f7f\u7528pip\u5b89\u88c5\npip install waterqsvg\n\n# \u4f7f\u7528uv\u5b89\u88c5\nuv add waterqsvg\n```\n\n## \ud83c\udfaf \u5feb\u901f\u5f00\u59cb\n\n### \u57fa\u672c\u4f7f\u7528\n\n```python\nfrom waterqsvg import WaterQualityProcessor\n\n# OSS ZIP\u6587\u4ef6URL\noss_zip_url = \"https://your-oss-bucket.oss-cn-shanghai.aliyuncs.com/data.zip\"\n\n# \u4f7f\u7528\u5904\u7406\u5668\nwith WaterQualityProcessor(\n    output_dir=\"./outputs\",\n    grid_resolution=400\n) as processor:\n    \n    # \u5904\u7406\u6570\u636e\u5e76\u751f\u6210SVG\n    results = processor.process_from_oss_zip(\n        zip_url=oss_zip_url,\n        colormap=\"jet\",\n        boundary_method=\"alpha_shape\",\n        interpolation_method=\"linear\",\n        transparent_bg=True\n    )\n    \n    # \u67e5\u770b\u7ed3\u679c\n    for indicator, result in results.items():\n        if result:\n            print(f\"\u6307\u6807: {result['indicator_name']}\")\n            print(f\"SVG\u6587\u4ef6: {result['svg_path']}\")\n            print(f\"\u8fb9\u754c\u6587\u4ef6: {result['bounds_path']}\")\n```\n\n### \u547d\u4ee4\u884c\u4f7f\u7528\n\n```bash\n# \u4f7f\u7528waterqsvg\u547d\u4ee4\uff08\u5b89\u88c5\u5305\u540e\u53ef\u7528\uff09\nwaterqsvg --zip-url \"https://example.com/data.zip\" --output-dir \"./outputs\"\n\n# \u4f7f\u7528JSON\u914d\u7f6e\u6587\u4ef6\nwaterqsvg --zip-url \"/path/to/config.json\" --colormap \"water_quality\" --resolution 600\n\n# \u4f7f\u7528\u6807\u51c6\u8f93\u5165\u4f20\u9012URL\uff08\u63a8\u8350\u7528\u4e8e\u590d\u6742URL\uff09\necho \"https://example.com/data.zip\" | waterqsvg --output-dir \"./outputs\"\necho \"/path/to/config.json\" | waterqsvg\n\n# \u517c\u5bb9\u7684interface.py\u65b9\u5f0f\uff08\u5f00\u53d1\u6a21\u5f0f\uff09\npython interface.py --zip-url \"https://example.com/data.zip\" --output-dir \"./outputs\"\n```\n\n### \u8fd0\u884c\u793a\u4f8b\n\n```bash\n# \u4f7f\u7528uv\u8fd0\u884c\u5f00\u53d1\u7248\u672c\nuv run waterqsvg --zip-url \"https://example.com/data.zip\"\n\n# \u8fd0\u884c\u4f7f\u7528\u793a\u4f8b\nuv run python example_usage.py\n```\n\n## \ud83d\udcca \u652f\u6301\u7684\u6c34\u8d28\u6307\u6807\n\n\u81ea\u52a8\u8bc6\u522b\u5e76\u5904\u7406\u4ee5\u4e0b\u6307\u6807\uff1a\n\n| \u6307\u6807\u4ee3\u7801 | \u4e2d\u6587\u540d\u79f0 | \u82f1\u6587\u540d\u79f0 | \u5355\u4f4d |\n|---------|---------|----------|------|\n| cod | \u5316\u5b66\u9700\u6c27\u91cf | Chemical Oxygen Demand | mg/L |\n| nh3n | \u6c28\u6c2e | Ammonia Nitrogen | mg/L |\n| tp | \u603b\u78f7 | Total Phosphorus | mg/L |\n| tn | \u603b\u6c2e | Total Nitrogen | mg/L |\n| chla | \u53f6\u7eff\u7d20a | Chlorophyll-a | \u03bcg/L |\n| cod_mn | \u9ad8\u9530\u9178\u76d0\u6307\u6570 | COD Permanganate | mg/L |\n| ss | \u603b\u60ac\u6d6e\u7269 | Total Suspended Solids | mg/L |\n| bga | \u84dd\u7eff\u85fb | Blue-Green Algae | \u7ec6\u80de/mL |\n\n## \ud83d\uddc2\ufe0f \u6570\u636e\u683c\u5f0f\u8981\u6c42\n\n### \u8f93\u5165\u6570\u636e\u7ed3\u6784\n\nZIP\u6587\u4ef6\u5fc5\u987b\u5305\u542b\uff1a\n- `INDEXS.csv` - \u6c34\u8d28\u6307\u6807\u6570\u636e\n- `POS.txt` - GPS\u5750\u6807\u6570\u636e\n\n#### INDEXS.csv \u683c\u5f0f\u793a\u4f8b\n```csv\nnumber,CHLa,Turbidity,SS,COD,TP,NH3-N,Bga,CODMn,TN\n1,6.646,10.689,10.635,9.053,0.066,0.127,6.034,3.174,0.471\n2,6.427,11.098,11.172,9.030,0.063,0.123,2.686,3.121,0.463\n```\n\n#### POS.txt \u683c\u5f0f\u793a\u4f8b\n```\n/path/file_1.csv latitude: 31.516106 longitude: 120.267944 height: 110.27\n/path/file_2.csv latitude: 31.516125 longitude: 120.267938 height: 110.26\n```\n\n## \ud83d\udcc2 \u8f93\u51fa\u6587\u4ef6\n\n\u6bcf\u4e2a\u6c34\u8d28\u6307\u6807\u751f\u6210\u4e24\u4e2a\u6587\u4ef6\uff1a\n\n### 1. SVG\u70ed\u529b\u56fe\u6587\u4ef6\n- \u6587\u4ef6\u540d\uff1a`{\u6307\u6807}_heatmap.svg`\n- \u683c\u5f0f\uff1a\u77e2\u91cfSVG\uff0c\u900f\u660e\u80cc\u666f\n- \u7528\u9014\uff1a\u76f4\u63a5\u53e0\u52a0\u5230\u5730\u56fe\u4e0a\n\n### 2. \u5730\u7406\u8fb9\u754cJSON\u6587\u4ef6\n- \u6587\u4ef6\u540d\uff1a`{\u6307\u6807}_bounds.json`\n- \u5185\u5bb9\uff1a\u7cbe\u786e\u7684\u7ecf\u7eac\u5ea6\u8fb9\u754c\u4fe1\u606f\n- \u7528\u9014\uff1a\u5730\u56fe\u5b9a\u4f4d\u548c\u53e0\u52a0\n\n#### \u8fb9\u754c\u6587\u4ef6\u793a\u4f8b\n```json\n{\n  \"geographic_bounds\": {\n    \"min_longitude\": 120.264922,\n    \"max_longitude\": 120.267936,\n    \"min_latitude\": 31.515932,\n    \"max_latitude\": 31.520750,\n    \"center_longitude\": 120.266429,\n    \"center_latitude\": 31.518341\n  },\n  \"grid_info\": {\n    \"grid_resolution\": 400,\n    \"valid_pixels\": 83583\n  },\n  \"projection_info\": {\n    \"coordinate_system\": \"WGS84\",\n    \"units\": \"degrees\"\n  }\n}\n```\n\n## \ud83c\udfa8 \u914d\u7f6e\u9009\u9879\n\n### \u989c\u8272\u6620\u5c04\n- `jet` - \u5f69\u8679\u8272\u6620\u5c04\uff08\u9ed8\u8ba4\uff09\n- `water_quality` - \u4e13\u4e1a\u6c34\u8d28\u8272\u5f69\n- `viridis` - \u611f\u77e5\u5747\u5300\u8272\u5f69\n- `RdYlBu_r` - \u7ea2-\u9ec4-\u84dd\u53cd\u5411\n\n### \u8fb9\u754c\u68c0\u6d4b\u65b9\u6cd5\n- `alpha_shape` - Alpha Shape\u7b97\u6cd5\uff08\u9ed8\u8ba4\uff0c\u9ad8\u7cbe\u5ea6\uff09\n- `convex_hull` - \u51f8\u5305\u7b97\u6cd5\uff08\u5feb\u901f\uff09\n- `density_based` - \u5bc6\u5ea6\u8fb9\u754c\u68c0\u6d4b\n\n### \u63d2\u503c\u65b9\u6cd5\n- `linear` - \u7ebf\u6027\u63d2\u503c\uff08\u9ed8\u8ba4\uff09\n- `cubic` - \u4e09\u6b21\u63d2\u503c\uff08\u66f4\u5e73\u6ed1\uff09\n- `nearest` - \u6700\u8fd1\u90bb\u63d2\u503c\n\n## \ud83c\udfd7\ufe0f \u9879\u76ee\u7ed3\u6784\n\n```\nsvg-water-quality-generator/\n\u251c\u2500\u2500 water_quality_processor.py    # \u4e3b\u5904\u7406\u811a\u672c\n\u251c\u2500\u2500 example_usage.py             # \u4f7f\u7528\u793a\u4f8b\n\u251c\u2500\u2500 src/                         # \u6838\u5fc3\u6a21\u5757\n\u2502   \u251c\u2500\u2500 core/                    # \u6838\u5fc3\u529f\u80fd\n\u2502   \u2502   \u251c\u2500\u2500 downloader.py        # OSS\u4e0b\u8f7d\u5668\n\u2502   \u2502   \u2514\u2500\u2500 extractor.py         # ZIP\u89e3\u538b\u5668\n\u2502   \u251c\u2500\u2500 data/                    # \u6570\u636e\u5904\u7406\n\u2502   \u2502   \u251c\u2500\u2500 parser.py            # \u6570\u636e\u89e3\u6790\u5668\n\u2502   \u2502   \u251c\u2500\u2500 standardizer.py      # \u6570\u636e\u6807\u51c6\u5316\n\u2502   \u2502   \u2514\u2500\u2500 validator.py         # \u6570\u636e\u9a8c\u8bc1\n\u2502   \u251c\u2500\u2500 interpolation/           # \u63d2\u503c\u7b97\u6cd5\n\u2502   \u2502   \u251c\u2500\u2500 alpha_shape.py       # Alpha Shape\n\u2502   \u2502   \u251c\u2500\u2500 convex_hull.py       # \u51f8\u5305\u7b97\u6cd5\n\u2502   \u2502   \u251c\u2500\u2500 density_boundary.py  # \u5bc6\u5ea6\u8fb9\u754c\n\u2502   \u2502   \u2514\u2500\u2500 enhanced_interpolation.py # \u589e\u5f3a\u63d2\u503c\n\u2502   \u251c\u2500\u2500 visualization/           # \u53ef\u89c6\u5316\n\u2502   \u2502   \u251c\u2500\u2500 svg_generator.py     # SVG\u751f\u6210\u5668\n\u2502   \u2502   \u251c\u2500\u2500 color_mapper.py      # \u989c\u8272\u6620\u5c04\n\u2502   \u2502   \u2514\u2500\u2500 layout_calculator.py # \u5e03\u5c40\u8ba1\u7b97\n\u2502   \u251c\u2500\u2500 config/                  # \u914d\u7f6e\n\u2502   \u2502   \u2514\u2500\u2500 indicators.py        # \u6307\u6807\u914d\u7f6e\n\u2502   \u2514\u2500\u2500 utils/                   # \u5de5\u5177\n\u2502       \u2514\u2500\u2500 logger.py            # \u65e5\u5fd7\u5de5\u5177\n\u2514\u2500\u2500 tests/                       # \u6d4b\u8bd5\n    \u2514\u2500\u2500 test_basic_functionality.py\n```\n\n## \ud83d\ude80 \u5730\u56fe\u53e0\u52a0\u793a\u4f8b\n\n\u751f\u6210\u7684SVG\u548c\u8fb9\u754c\u4fe1\u606f\u53ef\u4ee5\u76f4\u63a5\u7528\u4e8eWeb\u5730\u56fe\uff1a\n\n### Leaflet.js \u793a\u4f8b\n```javascript\n// \u8bfb\u53d6\u8fb9\u754c\u4fe1\u606f\nconst bounds = L.latLngBounds(\n  [31.515932, 120.264922],  // \u897f\u5357\u89d2\n  [31.520750, 120.267936]   // \u4e1c\u5317\u89d2\n);\n\n// \u53e0\u52a0SVG\u56fe\u50cf\nconst overlay = L.imageOverlay('cod_heatmap.svg', bounds, {\n  opacity: 0.7,\n  interactive: false\n});\n\noverlay.addTo(map);\n```\n\n## \ud83d\udee0\ufe0f \u5f00\u53d1\u73af\u5883\n\n### \u8fd0\u884c\u6d4b\u8bd5\n```bash\nuv run python tests/test_basic_functionality.py\n```\n\n### \u4ee3\u7801\u683c\u5f0f\u5316\n```bash\nblack src/ tests/ *.py\nflake8 src/ tests/ *.py\n```\n\n## \ud83d\udcdd \u7248\u672c\u4fe1\u606f\n\n- **\u5f53\u524d\u7248\u672c**: 1.0.0\n- **Python\u8981\u6c42**: >= 3.8\n- **\u4e3b\u8981\u4f9d\u8d56**: numpy, pandas, matplotlib, scipy\n\n## \ud83e\udd1d \u8d21\u732e\n\n\u6b22\u8fce\u63d0\u4ea4Issue\u548cPull Request\u6765\u6539\u8fdb\u8fd9\u4e2a\u9879\u76ee\u3002\n\n## \ud83d\udcc4 \u8bb8\u53ef\u8bc1\n\nMIT License - \u67e5\u770b [LICENSE](LICENSE) \u6587\u4ef6\u4e86\u89e3\u8be6\u60c5\u3002\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "\u4e13\u7528\u4e8e\u4ece\u6c34\u8d28\u76d1\u6d4b\u6570\u636e\u751f\u6210SVG\u70ed\u529b\u56fe\u7684\u72ec\u7acbPython\u5e93",
    "version": "1.0.2",
    "project_urls": {
        "Documentation": "https://github.com/1034378361/waterqsvg#readme",
        "Homepage": "https://github.com/1034378361/waterqsvg",
        "Issues": "https://github.com/1034378361/waterqsvg/issues",
        "Repository": "https://github.com/1034378361/waterqsvg"
    },
    "split_keywords": [
        "water-quality",
        " svg",
        " heatmap",
        " environmental",
        " monitoring"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8970e22e0aaecfda085af0d330d530452ee132b5c42d394ca7a73740058a63a9",
                "md5": "d3d337b1b5e9e42aec9290ac8692ea19",
                "sha256": "c2cca169e0f75b94cb9d4710253d4b40255b29c2ec00f34f4f55e5d2f52da408"
            },
            "downloads": -1,
            "filename": "waterqsvg-1.0.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "d3d337b1b5e9e42aec9290ac8692ea19",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.11",
            "size": 56165,
            "upload_time": "2025-07-09T05:43:33",
            "upload_time_iso_8601": "2025-07-09T05:43:33.245673Z",
            "url": "https://files.pythonhosted.org/packages/89/70/e22e0aaecfda085af0d330d530452ee132b5c42d394ca7a73740058a63a9/waterqsvg-1.0.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "024a30bb5564e5dd768ac4f0b6b0e67faece598cdec74f3051d4301b5737e1f3",
                "md5": "c0b937158471a20e758a9d534b27c9e1",
                "sha256": "59683c292c4dc0888e62544fda4b318a07ba28d88c5b8e9498efc1f25683e52d"
            },
            "downloads": -1,
            "filename": "waterqsvg-1.0.2.tar.gz",
            "has_sig": false,
            "md5_digest": "c0b937158471a20e758a9d534b27c9e1",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.11",
            "size": 113838,
            "upload_time": "2025-07-09T05:43:34",
            "upload_time_iso_8601": "2025-07-09T05:43:34.769389Z",
            "url": "https://files.pythonhosted.org/packages/02/4a/30bb5564e5dd768ac4f0b6b0e67faece598cdec74f3051d4301b5737e1f3/waterqsvg-1.0.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-09 05:43:34",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "1034378361",
    "github_project": "waterqsvg#readme",
    "github_not_found": true,
    "lcname": "waterqsvg"
}
        
Elapsed time: 0.52028s