【python010】获取任意多边形区域内的经纬度点并可视化

1.熟悉、梳理、总结项目研发实战中的Python开发日常使用中的问题、知识点等,如获取任意多边形区域内的经纬度点并可视化,找了N篇文章没发现有效的解决方案。
2.欢迎点赞、关注、批评、指正,互三走起来,小手动起来!
3.欢迎点赞、关注、批评、指正,互三走起来,小手动起来!
4.欢迎点赞、关注、批评、指正,互三走起来,小手动起来!

文章目录

    • 1.获取任意多边形边界经纬度`json`数据
    • 2.根据多边形区域生成区域内的坐标点数据`Python`代码
    • 3.经纬度点集压缩`Python`代码
    • 4.生成点位可视化`html`代码
    • 5.多边形及区域内经纬度点集可视化效果

1.获取任意多边形边界经纬度json数据

  • 方法一:http://www.guihuayun.com/maps/region_datav.php
    在这里插入图片描述

  • 方法二(高德平台):https://lbs.amap.com/demo/javascript-api-v2/example/district-search/draw-district-boundaries
    在这里插入图片描述

  • json数据坐标点位解析python代码示例

    jsonp_480370_1717574386373_ = {"status": "1","info": "OK","infocode": "10000","count": "1","suggestion": {"keywords": [],"cities": []},"districts": [{"citycode": "0571","adcode": "330112","name": "临安区","polyline": "119.826803,30.134153;119.826136,30.133364;119.824951,30.133047;119.821774,30.132589;119.817282,30.131128;119.814503,30.130486;119.813499,30.129761;119.811872,30.126984;119.81059,30.125801;119.807812,30.124766;119.804677,30.122295;119.80324,30.12009;119.802538,30.117812;119.802746,30.114885;119.802495,30.112591;119.802087,30.111689;119.800962,30.111131;119.797126,30.11034;119.791012,30.107358;119.790137,30.106339;119.789781,30.105194;119.789997,30.099349;119.789391,30.098497","center": "119.724457,30.234375","level": "district","districts": []}]
    }import geohash
    import pandas as pdll_result = []
    lnglats = []
    for ii in jsonp_480370_1717574386373_['districts'][0]['polyline'].split(';'):lng, lat = ii.split(',')lnglats.append( [float(lng), float(lat)] )ll_result.append( [lng, lat, geohash.encode( float(lat), float(lng), 6 )] )ll_result_df = pd.DataFrame( ll_result )
    ll_result_df.columns = ['lng', 'lat', 'geohash6']
    ll_result_df.head(3)
    
  • 边界数据可视化效果在这里插入图片描述

2.根据多边形区域生成区域内的坐标点数据Python代码

  • polygon_coords = lnglats
    # 导入必要的库
    # pip install shapely
    import numpy as np
    from shapely.geometry import Point, Polygon# ================================================
    # 经纬度坐标点 lnglats(list) 数组赋值
    polygon_coords = lnglats # 定义多边形区域的顶点坐标
    grid_interval = 0.005 # 定义格网的经纬度间隔# 定义格网范围
    min_lon = min(polygon_coords, key=lambda x: x[0])[0]
    max_lon = max(polygon_coords, key=lambda x: x[0])[0]
    min_lat = min(polygon_coords, key=lambda x: x[1])[1]
    max_lat = max(polygon_coords, key=lambda x: x[1])[1]# 划分格网
    lon_range = np.arange(min_lon, max_lon, grid_interval)
    lat_range = np.arange(min_lat, max_lat, grid_interval)polygon = Polygon(polygon_coords)
    grid_points = []
    for lon in lon_range:for lat in lat_range:
    #         print( lon, lat )point = Point(lon, lat)
    #         print( polygon.contains(point) )if polygon.contains(point): # 判断格网是否在多边形内grid_points.append((lon, lat))# 打印落入多边形内的经纬度坐标格网
    for point in grid_points:print(point)
    

3.经纬度点集压缩Python代码

  • 提示: 如果经纬度点太多,可视化过程比较慢,可能导致浏览器崩溃。

    import math
    EARTH_RADIUS = 6371000 # 地球平均半径,单位:米
    def haversine(lat1, lon1, lat2, lon2):"""计算两个经纬度点之间的距离(单位:米)"""lat1, lon1, lat2, lon2 = map(math.radians, [lat1, lon1, lat2, lon2]) # 将经纬度转换为弧度dlon = lon2 - lon1 # Haversine公式dlat = lat2 - lat1a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2c = 2 * math.asin(math.sqrt(a))r = EARTH_RADIUSreturn c * rdef merge_points(points, threshold=10):"""合并距离在threshold(单位:米)以内的经纬度点"""merged_points = []for point in points:merged = Falsefor merged_point in merged_points:distance = haversine(point[0], point[1], merged_point[0], merged_point[1])if distance <= threshold:merged = True # 更新已合并的点(这里简单地取第一个点的经纬度)breakif not merged:merged_points.append(point)return merged_pointspoints = lnglats
    merged_points = merge_points(points, threshold=500)
    print(len(merged_points), len(lnglats))
    

4.生成点位可视化html代码

  • ak=tUUW8mROQP659ly3fqG7eOjRz2kku5xt 替换为自己的百度ak
    <!DOCTYPE html>
    <html>
    <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta name="viewport" content="initial-scale=1.0, user-scalable=no" /><style type="text/css">body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}#l-map{height:100%;width:78%;float:left;border-right:2px solid #bcbcbc;}#r-result{height:100%;width:20%;float:left;}</style><script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=tUUW8mROQP659ly3fqG7eOjRz2kku5xt"></script><title>任意多边形区域及内部经纬度点位可视化</title>
    </head>
    <body><div id="allmap"></div>
    </body>
    </html>
    <script type="text/javascript">
    // 经纬度数据对象
    var pointDataBJ = [ ]; // 多边形区域边界经纬度点位集合
    var pointData = [ ]; // 多边形内部经纬度点位集合
    var pointD = new BMap.Point(119.79569599999995, 30.133075); // 经纬度对象
    var map = new BMap.Map("allmap");  // 创建百度地图实例
    map.enableScrollWheelZoom(); // 允许百度地图缩放
    map.centerAndZoom(pointD, 1);  // 初始化地图级别和中心店
    function showPointBJ (pointArr) {var myIconBJ = new BMap.Icon("./map_normal_bj.svg", new BMap.Size(50,50));pointArr.forEach(function(item, index){var point = new BMap.Point(item.longitude, item.latitude); // 经纬度对象var marker = new BMap.Marker(point, {icon: myIconBJ});  // 创建标注marker.mapDataIndex = index; // 将数据对象的索引存到对象中map.addOverlay(marker);  // 将标注添加到地图中marker.addEventListener("click",getAttr);});
    }
    function showPoint (pointArr) {var myIcon = new BMap.Icon("./map_normal.svg", new BMap.Size(50,50));pointArr.forEach(function(item, index){var point = new BMap.Point(item.longitude, item.latitude); // 经纬度对象var marker = new BMap.Marker(point, {icon: myIcon});  // 创建标注marker.mapDataIndex = index; // 将数据对象的索引存到对象中map.addOverlay(marker);  // 将标注添加到地图中marker.addEventListener("click",getAttr);});
    }
    // 调用的点击事件
    function getAttr(){// maker对象调用this就会指向他var obj = this.getPosition();       //获取marker的位置alert("marker的位置是" + obj.lng + "," + obj.lat);alert("marker的索引是" + this.mapDataIndex);// window.location.href="http://www.baidu.com";   
    }
    showPointBJ(pointDataBJ);
    showPoint(pointData);
    </script>
    

5.多边形及区域内经纬度点集可视化效果

  • 1000米间隔
    在这里插入图片描述
  • 2000米间隔
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/848237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【一步一步了解Java系列】:重磅多态

看到这句话的时候证明&#xff1a;此刻你我都在努力 加油陌生人 个人主页&#xff1a;Gu Gu Study专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xff1a;小闭…

低代码开发平台一般都有哪些功能和模块?

在当今快速变化的数字化时代&#xff0c;企业对于高效、灵活且经济的软件开发解决方案的需求愈发迫切。低代码开发平台应运而生&#xff0c;成为众多企业实现数字化转型的首选工具。本文将详细探讨低代码开发平台一般具备的主要功能和模块&#xff0c;以及它们如何助力企业提升…

6月5日 C++day3

#include <iostream>using namespace std;class Per { private:string name;int age;int *high;double *weight; public:Per(){cout << "Per的无参构造" << endl;}Per(string name,int age,int high,double weight):\name(name),age(age),high(new…

trace32 显示用户进程用户态调用栈

在只加载了linux vmlinux符号表的情况下&#xff0c;trace32 只能显示内核态的调用栈函数信息&#xff0c;无法显示用户态调用栈的函数信息&#xff1a; 查看进程maps 确认地址0x40616C为进程/bin/box的虚拟地址&#xff1b;而0xFFFF904E12FC为/lib/libc-2.30.so的地址&#x…

字节跳动Seed-TTS文本到语音模型家族

字节跳动的SEED TTS&#xff08;Seed-TTS&#xff09;是一系列大规模自回归文本转语音&#xff08;TTS&#xff09;模型&#xff0c;能够生成与人类语音几乎没有区别的高质量语音。该模型在语音上下文学习方面表现出色&#xff0c;尤其在说话者相似度和自然度方面的表现&#x…

特惠电影票api接口文档,宜选影票接口文档不断优化

宜选影票接口文档的优化是一个持续的过程&#xff0c;旨在提高API的易用性、稳定性和安全性。以下是根据参考文章和相关经验&#xff0c;对宜选影票接口文档优化的一些建议&#xff0c;采用分点表示和归纳的方式&#xff1a; 1. 明确接口目标和功能 清晰定义&#xff1a;在接…

css动画案例练习之会展开的魔方和交错的小块

这里写目录标题 一级目录二级目录三级目录 下面开始案例的练习&#xff0c;建议第一个动手操作好了再进行下一个一、交错的小块效果展示1.大致思路1.基本结构2.实现动态移动 2.最终版代码 二、会展开的魔方1.大致思路1.基本结构;2.静态魔方的构建3.让静态的魔方动起来 2.最终版…

【MySQL】表的基本操作

&#x1f30e;表的基本操作 文章目录&#xff1a; 表的基本操作 创建查看表       创建表       查看表结构 表的修改       表的重命名       表的添加与修改       删除表结构 总结 前言&#xff1a; 在数据库中&#xff0c;数据表是存储和组…

鸿蒙状态管理-@Builder自定义构建函数

Builder 将重复使用的UI元素抽象成一个方法 在build方法里调用 使其成为 自定义构建函数 Entry Component struct BuilderCase {build() {Column(){Row(){Text("西游记").fontSize(20)}.justifyContent(FlexAlign.Center).backgroundColor("#f3f4f5").hei…

性能测试-测试方法总结(压力/负载)超详细

前言 并发/负载/压力理解 负载测试&#xff1a;通过不断加压使系统达到瓶颈&#xff0c;为调优提供参考数据 压力测试&#xff1a; 稳定性压力测试&#xff1a;在不同的给定的条件下&#xff08;比如内存的使用&#xff0c;一定时间段内有多少请求等&#xff09;&#xff0c…

IEAD常用快捷键

如题 网页图片不清晰&#xff0c;可下载后查看

NXP i.MX8系列平台开发讲解 - 3.14 Linux 之Power Supply子系统(一)

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 目录 1. Power Supply子系统介绍 2. Power Supply子系统框架 3. Power Supply代码分析 本章节主要介绍Linux 下的P…

vs2019 c++20 规范的头文件 <future> 源码注释和几个结论

&#xff08;1 探讨一&#xff09;在多线程中&#xff0c;需要线程返回值的可以用该头文件中的类。该头文件中模板类和模板函数定义很多&#xff0c;用一幅图给出模板类之间的关系&#xff0c;方便从整体上把握和记忆&#xff1a; &#xff08;2&#xff09;

6.5 作业

设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数。 #include <iostream>using namespace std; class Stu { privat…

GNN与Transformer创新结合!模型性能起飞!

前言 近年来&#xff0c;图神经网络&#xff08;GNN&#xff09;和Transformer模型分别凭借其独到的优势&#xff0c;在处理复杂数据结构和识别序列间的相互依赖性方面取得了突破性进展&#xff0c;这些优势使得GNN和Transformer的结合成为图表示学习领域的一个有前景的研究方…

IP黑名单与IP白名单是什么?

在IP代理使用中&#xff0c;我们经常听到黑名单与白名单两个名词&#xff0c;它们不仅提供了强大的防御机制&#xff0c;还可以灵活应对不同的安全威胁。本文将详细探讨IP黑名单和白名单在网络安全中的双重屏障作用。 一、IP黑名单和白名单定义 IP黑名单与IP白名单是网络安全中…

区块链游戏(链游)安全防御:抵御攻击的策略与实践

一、引言 区块链游戏&#xff0c;或称为链游&#xff0c;近年来随着区块链技术的普及而迅速崛起。然而&#xff0c;如同其他任何在线平台一样&#xff0c;链游也面临着各种安全威胁。本文将探讨链游可能遭遇的攻击类型以及如何通过有效的策略和技术手段进行防御。 二、链游可…

小孩天赋是怎样炼成的 懂孩子比爱孩子更重要 详细天赋评估列表 观察非常细致 培养领导能力的方法

懂孩子比爱孩子更重要 “懂孩子比爱孩子更重要&#xff0c;懂才更准确的去爱” 这句话说得很有道理。理解孩子的内心世界、需求和独特个性&#xff0c;比单纯地给予爱更加重要。以下是一些解释&#xff1a; 理解孩子的需要&#xff1a;懂孩子意味着理解他们的需求、恐惧、欢乐…

大模型时代的具身智能系列专题(十)

Sergey Levine团队 Sergey Levine目前是UC Berkeley电气工程与计算机科学系的副教授&#xff0c;同时是RAIL(Robotic AI&Learning LabBAIR)实验室主任。除了在Berkeley的教职&#xff0c;Levine也是Google Brain的研究员&#xff0c;他也参与了Google知名的机器人大模型PA…

C#——随机类Random类

Random类 C#的Random类是用于生成随机数的类&#xff0c;属于System命名空间&#xff0c;可以生成各种类型的随机数&#xff0c;例如整型、双精度浮点型、布尔型等。 使用方法&#xff1a; 使用random数据类型关键字 声明一个random的变量 值使用new random 来实例化这个变量…