【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 pd
    
    ll_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 - lat1
    	a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2
    	c = 2 * math.asin(math.sqrt(a))
    	r = EARTH_RADIUS
    	return c * r
    
    def merge_points(points, threshold=10):
        """合并距离在threshold(单位:米)以内的经纬度点"""
        merged_points = []
        for point in points:
            merged = False
            for merged_point in merged_points:
                distance = haversine(point[0], point[1], merged_point[0], merged_point[1])
                if distance <= threshold:
                    merged = True # 更新已合并的点(这里简单地取第一个点的经纬度)
                    break
        if not merged:
            merged_points.append(point)
        return merged_points
    
    points = 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米间隔
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode刷题(四十)

Pow(x, n)&#xff08;Medium&#xff09; 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。示例 1&#xff1a;输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000 示例 2&#xff1a;输入&#xff1a;x 2.1…

微服务Day7学习-数据聚合、同步、补全

文章目录 数据聚合聚合分类 自动补全DSL实现Bucket聚合DSL实现Metrics聚合RestAPI实现聚合多条件聚合对接前端接口拼音分词器自定义分词器自动补全查询实现酒店搜索框自动补全 数据同步数据同步思路分析利用mq实现mysql与elasticsearch数据同步 集群介绍搭建ES集群 数据聚合 聚…

电拖基础JIAOXUE

1.最简单的TT马达&#xff0c;实际就是一个减速电机&#xff1a; 减速箱的内部包含了一组齿轮。在实际的使用中&#xff0c;绝大部分的电动机都要和减速箱配合使用&#xff0c;因为一般的电机转速都在每分钟几千转甚至1万转以上&#xff0c;而在实际的使用中并不需要这么快的转…

RN:Error: /xxx/android/gradlew exited with non-zero code: 1

问题 执行 yarn android 报错&#xff1a; 解决 这个大概率是缓存问题&#xff0c;我说一下我的解决思路 1、yarn doctor 2、根据黄色字体提示&#xff0c;说我包版本不对&#xff08;但是这个是警告应该没事&#xff0c;但是我还是装了&#xff09; npx expo install --…

Lodop 实现局域网打印

文章目录 前言一、Lodop支持打印的方式lodop 打印方式一般有3种&#xff1a;本地打印局域网集中打印广域网AO打印 二、集成步骤查看lodop 插件的服务端口&#xff1a;查看ip后端提供接口返回ip&#xff0c;前端动态获取最后步骤 前言 有时候会根据不同的ip来获取资源文件&…

计算机网络 期末复习(谢希仁版本)第6章

DNS采用UDP。 DHCP 给运行服务器软件、且位置固定的计算机指派一个永久地址&#xff0c;给运行客户端软件的计算机分配一个临时地址

文件无法在当前环境下执行在 x86_64 系统上运行 ARM 可执行文件

目录 遇到的问题是由于"..."文件无法在当前环境下执行。这个错误通常是因为二进制文件的格式不兼容&#xff0c;可能是因为它是为不同的架构编译的。例如&#xff0c;如果二进制文件是为 x86 架构编译的&#xff0c;但你在 ARM 设备上尝试运行它&#xff0c;就会出现…

语言模型测试系列【9】

语言模型 文心一言讯飞星火通义千问2.5豆包360智脑百小应腾讯元宝KimiC知道 好长时间没有做语言模型的测试了&#xff0c;一方面是没有好的素材&#xff0c;各模型都在升级优化&#xff0c;而且频率很高&#xff1b;另一方面近期在阅读和学习其他的知识&#xff0c;所以更的也…

Typora编辑的markdown文档莫名其妙消失或未保存--解决方案【亲测可行】

由于误触键盘导致文件关闭&#xff0c;打开文件之后发现里面文字全没了~气死了&#xff01;&#xff01;&#xff01;&#xff01; 可以通过如下方法解决&#xff01; 一、打开typora 二、【文件】-【偏好设置】 三、点击恢复未保存的草稿&#xff0c;找到最近的文件复制粘贴…

针对AlGaN/GaN高电子迁移率晶体管的显式表面电势计算和紧凑电流模型

来源&#xff1a;An Explicit Surface Potential Calculation and Compact Current Model for AlGaN/GaN HEMTs&#xff08;EDL 15年&#xff09; 摘要 在本文中,我们提出了一种新的紧凑模型,用于基于费米能级和表面电位的显式解来描述AlGaN/GaN高电子迁移率晶体管。该模型计算…

【LLM】度小满金融大模型技术创新与应用探索

note 从通用大模型到金融大模型金融大模型的训练技术创新金融大模型的评测方法创新金融大模型的应用实践创新总结&#xff1a;金融大模型迭代路径 一、轩辕大模型 二、垂直大模型训练 1. 数据准备 数据质量是模型效果的保障。首先数据要丰富&#xff0c;这是必备的条件。我们…

hcache缓存查看工具

1、hcache概述 hcache是基于pcstat的&#xff0c;pcstat可以查看某个文件是否被缓存和根据进程pid来查看都缓存了哪些文件。hcache在其基础上增加了查看整个操作系统Cache和根据使用Cache大小排序的特性。官网:https://github.com/silenceshell/hcache 2、hcache安装 2.1下载…

Python Flask 入门开发

Python基础学习&#xff1a; Pyhton 语法基础Python 变量Python控制流Python 函数与类Python Exception处理Python 文件操作Python 日期与时间Python Socket的使用Python 模块Python 魔法方法与属性 Flask基础学习&#xff1a; Python中如何选择Web开发框架&#xff1f;Pyth…

【Tool】Matlab 数据分析可视化

一、问题描述 近期围绕imu总是出现问题&#xff0c;自己整理了一下将数据可视化的工具 二、imu 类 1. 待处理数据格式 # yaw roll pitch time -2.08131 -0.0741765 0.0200713 121.281000000 -2.08724 -0.0745256 0.0197222 121.301000000 -2.093 -0.075747…

【机器学习基础】Python编程01:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些…

吴恩达2022机器学习专项课程C2W3:2.24 机器学习实践建议(决定下一步做什么模型评估模型选择交叉验证)

目录 引言一、绘图评估模型的局限性二、使用测试集评估模型1.线性回归2.逻辑回归3.测试误差与泛化误差 三、测试集评估模型存在的问题1.评估模型流程2.流程存在的问题 四、解决问题1.训练集分割成三段2.计算交叉验证集的误差 五、重新评估模型1.线性回归模型2.神经网络模型3.评…

Android 14.0 Settings主页面去掉自定义您的设备等菜单相关功能

1.前言 在14.0的系统rom产品定制化开发中,在系统Settings主页面的主菜单中,在测试某些功能的时候,比如开启护眼模式和改变系统密度会在主菜单第一项的网络菜单头部增加 自定义您的设备和设置护眼模式时间安排 等等相关的设置模块 这对于菜单布局显示相当不美观,所以根据系…

SpringBoot+Redis发送短信

SpringBootRedis发送短信 pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId&g…

【TB作品】 51单片机8x8点阵显示滚动汉字仿真

功能 题目5基于51单片机LED8x8点阵显示 流水灯 直接滚动显示HELLO 直接滚动显示老师好 代码 void main( void ) {/** 移位后&#xff0c;右边的是第一个595&#xff0c;接收0X02&#xff0c;显示出0X02* 移位后&#xff0c;左边的是第2个595&#xff0c;接收0Xfe&#xff0c…

git 的基本操作 Master and branch的版本合并 @ VS 1019

前言&#xff1a; 在VS 2019有git 的可视化管理,但&#xff0c;感觉微软其实就是在git上包了一层。版本冲突后&#xff0c;还是要靠git 的命令行代码搞。本文记录了一次&#xff0c;branch和master的版本合并的过程。作为&#xff0c;后续的参考。 【注意&#xff0c;这个是一…