from urllib.parse import urlencode, unquote import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature import cartopy.io.shapereader as shpreader from cartopy.feature import ShapelyFeature, NaturalEarthFeature from shapely.geometry import LineString import geopandas as gpd from fastapi import FastAPI, Request from fastapi.middleware.cors import CORSMiddleware # 启动服务器 # pip install uvicorn # uvicorn main:app --host 192.168.220.1 --port 9080 app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=["*"], # 允许所有来源,或者指定来源列表 allow_credentials=True, allow_methods=["*"], # 允许所有方法 allow_headers=["*"], # 允许所有头部 ) # @app.get("/getpng") # @app.get("/getpng") # async def print_hi(urls: str): def print_hi(): result = { "code": 0, "data": "aaaaaaaaa" } geojson_file_path = r'C:\Users\shiys\Desktop\UPPERTT2022040500200_LINE.geojson' # geojson_file_path = unquote(urls) geojson_data = gpd.read_file(geojson_file_path) geometries = geojson_data.geometry # 创建图形和轴 fig = plt.figure(figsize=(10, 10)) plt.rcParams['font.family'] = 'SimHei' ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree()) # 设置地图的范围 ax.set_extent([60, 150, 10, 58], crs=ccrs.PlateCarree()) # 陆地 ax.add_feature(NaturalEarthFeature('physical', 'land', '50m', edgecolor='#cfedf7', facecolor='white')) # 边框 ax.add_feature(NaturalEarthFeature('cultural', 'admin_0_countries', '50m', edgecolor='#2b94d7', facecolor='none', linewidth=0.2)) # 设置海洋颜色 ocean_color = '#cfedf7' # 海洋蓝色 ax.add_feature(cfeature.OCEAN.with_scale('50m'), facecolor=ocean_color) # 读取并绘制省份边界 # 指定shapefile路径 china_admin_file = shpreader.Reader(r'D:\javaproject\weather\weather\python\python\doc\china.shp') print(china_admin_file.records()); for record in china_admin_file.records(): # 使用geometries()方法获取几何信息 geometry = record.geometry ax.add_geometries([geometry], ccrs.PlateCarree(), facecolor='white', edgecolor='#c6aecb', linewidth=0.2) # 提取省份名称 province_name = record.attributes['NAME'] # 这里的'NAME_1'取决于你的shapefile中的字段名 # 计算省份中心点 center_x, center_y = geometry.centroid.x, geometry.centroid.y # 在地图上添加省份名称 ax.text(center_x, center_y, province_name, transform=ccrs.PlateCarree(), fontsize=4, color='#43a2ff', zorder=2) # 创建 ShapelyFeature(等高线) geo_feature = ShapelyFeature(geometries, ccrs.PlateCarree(), edgecolor='#0000ff', facecolor='none', linewidth=0.3, zorder=5) # 提取几何对象和对应的数值 geometriespoint = geojson_data['geometry'] values = geojson_data['VAL'] # 在等高线上标注数值 for index, (geometrypoint, value) in enumerate(zip(geometriespoint, values)): if isinstance(geometrypoint, LineString): # 解析 LINESTRING Z 数据 parsed_coords = str(geometries[index]).replace("LINESTRING Z (", "").replace(")", "") parsed_coords = [tuple(map(float, coord.strip().split())) for coord in parsed_coords.split(",")] first_coord = parsed_coords[0] x, y, z = first_coord # 计算线段的中点 midpoint = geometrypoint.interpolate(0.5, normalized=True) if 60 < midpoint.x < 150 and 10 < midpoint.y < 58: # 标注数值 bbox_props = dict(boxstyle="round,pad=0", facecolor="white", edgecolor="none", lw=1) ax.text(midpoint.x, midpoint.y, f"{z}", fontsize=4, ha='center', va='center', color='#0000ff', bbox=bbox_props, zorder=8) # 添加 GeoJSON 特征 ax.add_feature(geo_feature) # 保存为 PNG 图像 output_file_path = 'D:\zxmTest\pngs\output.png' plt.savefig(output_file_path, dpi=600) # 显示图形 # plt.show() result['code'] = 1 result['data'] = output_file_path # except: # result['code'] = 0 # result['data'] = "文件转换图片失败,请重试" return result if __name__ == '__main__': # 指定 GeoJSON 文件路径 # geojson_path = "D:\\javaproject\\UPPERTT2022040500100_LINE.geojson" # # # 使用 geopandas 读取 GeoJSON 文件 # gdf = gpd.read_file(geojson_path) # # # 打印 GeoDataFrame 的基本信息 # print(gdf.geometry) print_hi() # 输出 geopandas 的版本号 # print(f"Geopandas version: {gpd.__version__}")