springboot基础(80):redis geospatial的应用

文章目录

  • 前言
  • redis geospatial
  • 如何从地图上获取经纬度
  • springboot 的相关方法调用
    • 准备redis服务器
    • 引用的依赖
    • 预设位置的key
    • GEOADD 添加位置
    • GEORADIUS 获取指定经纬度附件的停车场(deprecated)
    • GEORADIUS 获取指定成员附件的停车场(deprecated)
    • GEOSEARCH 搜索指定经纬度附件的停车场
    • GEOSEARCH 搜索指定成员附件的停车场
    • GEOPOS获取指定成员经纬度
    • GEODIST获取两点之间的距离
    • GEOHASH获取坐标的hash
    • ZREM 移除位置
  • 数学球面计算两点距离

前言

基于redis geospatial的应用比较广泛,比如需要获取附件5公里的停车场。

官方文档:https://redis.io/docs/data-types/geospatial/

代码已分享至Gitee:https://gitee.com/lengcz/redisgeo

redis geospatial

用于地理位置服务的计算,它能做哪些?

  • 我周边的共享单车的信息,可以按距离输出
  • 两坐标、车辆之间的距离

如何从地图上获取经纬度

高德地图:
https://lbs.amap.com/demo/javascript-api/example/map/click-to-get-lnglat/

百度地图:
https://api.map.baidu.com/lbsapi/getpoint/index.html

springboot 的相关方法调用

准备redis服务器

需要安装redis 服务器

引用的依赖

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>

注意本demo中的springboot版本为2.7.15,如果你的版本较低,可能部分GEOSEARCH 的API不可用。
如果遇到demo中的示例出现报红,请考虑是否为依赖版本过低。

预设位置的key

private String positionKey = "parking";

GEOADD 添加位置

官方文档: https://redis.io/commands/geoadd/

GEOADD key [NX | XX] [CH] longitude latitude member [longitude
  latitude member ...]

注意经纬度需要在范围内

  • 经度 -180到180
  • 纬度 -85.05112878到85.05112878

如果你添加的经纬度超出范围会报错

XX: 仅更新已存在的元素。永远不要添加元素。
NX:不要更新已经存在的元素。始终添加新元素。
CH:将返回值从添加的新元素数量修改为更改的元素总数(CH是changed的缩写)。已更改的图元是添加的新元素和已更新坐标的现有图元。因此,命令行中指定的分数与过去相同的元素将不被计算在内。注意:通常情况下,GEOADD的返回值只计算添加的新元素数量。

 @Test
    void geoAdd(@Autowired RedisTemplate redisTemplate) {
        System.out.println("--------添加位置-----");
        GeoOperations geoOperations = redisTemplate.opsForGeo();
        {
            Long addedNum = geoOperations
                    .add(positionKey, new Point(-122.27652, 37.805186), "10001:市图书馆");
            System.out.println(addedNum);
        }
        {
            Long addedNum = geoOperations
                    .add(positionKey, new Point(-122.2674626, 37.8062344), "10002:百货大楼");
            System.out.println(addedNum);
        }
        {
            Long addedNum = geoOperations
                    .add(positionKey, new Point(-122.2469854, 37.8104049), "10003:科学中心");
            System.out.println(addedNum);
        }

        {
            Long addedNum = geoOperations
                    .add(positionKey, new Point(-122.2625112, 37.793513), "10004:博物馆");
            System.out.println(addedNum);
        }

        System.out.println("--------添加位置END-----");
    }

GEORADIUS 获取指定经纬度附件的停车场(deprecated)

官方文档: https://redis.io/commands/georadius/

从Redis版本6.2.0开始,此命令被视为已弃用。
在迁移或编写新代码时,可以用带有BYRADIUS参数的GEOSEARCH和GEOSEARCHSTORE替换它。

GEORADIUS key longitude latitude radius <M | KM | FT | MI>
  [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC]
  [STORE key | STOREDIST key]

单位

  • m 米
  • km 千米
  • mi 英里
  • ft 英尺
  @Test
    void geoRadius(@Autowired RedisTemplate redisTemplate) {
        // 指定经纬度附近5公里的停车场
        Circle circle = new Circle(new Point(-122.2612767, 37.793684), RedisGeoCommands.DistanceUnit.KILOMETERS.getMultiplier());
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeCoordinates().includeDistance().sortAscending().limit(5);
        GeoResults<RedisGeoCommands.GeoLocation<String>> results = redisTemplate.opsForGeo()
                .radius(positionKey, circle, args);
        System.out.println(results);
        for (GeoResult<RedisGeoCommands.GeoLocation<String>> g : results) {
            System.out.println(g);
            String addr = g.getContent().getName();
            System.out.println("addr:" + addr + ",distance:" + g.getDistance().getValue());
        }
    }

运行结果

GeoResult [content: RedisGeoCommands.GeoLocation(name=10004:博物馆, point=Point [x=-122.262509, y=37.793512]), distance: 109.9417 METERS, ]
addr:10004:博物馆,distance:109.9417
GeoResult [content: RedisGeoCommands.GeoLocation(name=10002:百货大楼, point=Point [x=-122.267460, y=37.806234]), distance: 1497.9608 METERS, ]
addr:10002:百货大楼,distance:1497.9608
GeoResult [content: RedisGeoCommands.GeoLocation(name=10001:市图书馆, point=Point [x=-122.276520, y=37.805185]), distance: 1852.3499 METERS, ]
addr:10001:市图书馆,distance:1852.3499
GeoResult [content: RedisGeoCommands.GeoLocation(name=10003:科学中心, point=Point [x=-122.246984, y=37.810404]), distance: 2244.1523 METERS, ]
addr:10003:科学中心,distance:2244.1523

GEORADIUS 获取指定成员附件的停车场(deprecated)

 @Test
    void geoRadius2(@Autowired RedisTemplate redisTemplate) {
        // 指定地址附近5公里的停车场
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeCoordinates().includeDistance().sortAscending().limit(5);
        GeoResults<RedisGeoCommands.GeoLocation<String>> results = redisTemplate.opsForGeo()
                .radius(positionKey, "10001:市图书馆", new Distance(5, Metrics.KILOMETERS), args);
        System.out.println(results);
        for (GeoResult<RedisGeoCommands.GeoLocation<String>> g : results) {
            System.out.println(g);
            String addr = g.getContent().getName();
            System.out.println("addr:" + addr + ",distance:" + g.getDistance().getValue());
        }
    }

执行结果

GeoResult [content: RedisGeoCommands.GeoLocation(name=10001:市图书馆, point=Point [x=-122.276520, y=37.805185]), distance: 0.0 KILOMETERS, ]
addr:10001:市图书馆,distance:0.0
GeoResult [content: RedisGeoCommands.GeoLocation(name=10002:百货大楼, point=Point [x=-122.267460, y=37.806234]), distance: 0.8047 KILOMETERS, ]
addr:10002:百货大楼,distance:0.8047
GeoResult [content: RedisGeoCommands.GeoLocation(name=10004:博物馆, point=Point [x=-122.262509, y=37.793512]), distance: 1.7894 KILOMETERS, ]
addr:10004:博物馆,distance:1.7894
GeoResult [content: RedisGeoCommands.GeoLocation(name=10003:科学中心, point=Point [x=-122.246984, y=37.810404]), distance: 2.6597 KILOMETERS, ]
addr:10003:科学中心,distance:2.6597


GEOSEARCH 搜索指定经纬度附件的停车场

官方文档: https://redis.io/commands/geosearch/

注意该命令从redis 6.0.2开始。

GEOSEARCH key <FROMMEMBER member | FROMLONLAT longitude latitude>
  <BYRADIUS radius <M | KM | FT | MI> | BYBOX width height <M | KM |
  FT | MI>> [ASC | DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST]
  [WITHHASH]
    @Test
    void geoSearch(@Autowired RedisTemplate redisTemplate) {
        // 指定经纬度附近5公里的停车场
        RedisGeoCommands.GeoSearchCommandArgs geoSearchCommandArgs = RedisGeoCommands.GeoSearchCommandArgs.newGeoSearchArgs().includeCoordinates().includeDistance().sortAscending();
        GeoResults<RedisGeoCommands.GeoLocation> searchResult = redisTemplate.opsForGeo().search(positionKey, new GeoReference.GeoCoordinateReference(-122.2612767, 37.793684), new Distance(5, Metrics.KILOMETERS), geoSearchCommandArgs);
//        System.out.println(searchResult);
        List<GeoResult<RedisGeoCommands.GeoLocation>> content = searchResult.getContent();
        for (GeoResult<RedisGeoCommands.GeoLocation> g : content) {
//            System.out.println(g);
            RedisGeoCommands.GeoLocation content1 = g.getContent();
            Distance distance = g.getDistance();
            System.out.println("content1:" + content1 + ",distance:" + distance);
        }
    }

执行结果

content1:RedisGeoCommands.GeoLocation(name=10004:博物馆, point=Point [x=-122.262509, y=37.793512]),distance:0.1099 KILOMETERS
content1:RedisGeoCommands.GeoLocation(name=10001:市图书馆, point=Point [x=-122.276520, y=37.805185]),distance:1.8523 KILOMETERS
content1:RedisGeoCommands.GeoLocation(name=10003:科学中心, point=Point [x=-122.246984, y=37.810404]),distance:2.2442 KILOMETERS

GEOSEARCH 搜索指定成员附件的停车场

 @Test
    void geoSearch2(@Autowired RedisTemplate redisTemplate) {
        // 指定成员附近5公里的停车场
        RedisGeoCommands.GeoSearchCommandArgs geoSearchCommandArgs = RedisGeoCommands.GeoSearchCommandArgs.newGeoSearchArgs().includeCoordinates().includeDistance().sortAscending();
        GeoResults<RedisGeoCommands.GeoLocation> searchResult = redisTemplate.opsForGeo().search(positionKey, new GeoReference.GeoMemberReference<>("10004:博物馆"), new Distance(5, Metrics.KILOMETERS), geoSearchCommandArgs);
//        System.out.println(searchResult);
        List<GeoResult<RedisGeoCommands.GeoLocation>> content = searchResult.getContent();
        for (GeoResult<RedisGeoCommands.GeoLocation> g : content) {
//            System.out.println(g);
            RedisGeoCommands.GeoLocation content1 = g.getContent();
            Distance distance = g.getDistance();
            System.out.println("content1:" + content1 + ",distance:" + distance);
        }
    }

执行结果

content1:RedisGeoCommands.GeoLocation(name=10004:博物馆, point=Point [x=-122.262509, y=37.793512]),distance:0.0 KILOMETERS
content1:RedisGeoCommands.GeoLocation(name=10001:市图书馆, point=Point [x=-122.276520, y=37.805185]),distance:1.7894 KILOMETERS
content1:RedisGeoCommands.GeoLocation(name=10003:科学中心, point=Point [x=-122.246984, y=37.810404]),distance:2.3219 KILOMETERS

GEOPOS获取指定成员经纬度

官方文档 https://redis.io/commands/geopos/

GEOPOS key [member [member ...]]
    @Test
    void geoGetPoints(@Autowired RedisTemplate redisTemplate) {
        List<Point> points = redisTemplate.opsForGeo().position(positionKey, "10003:科学中心", "10004:博物馆");
        System.out.println(points);
    }

执行结果

[Point [x=-122.246984, y=37.810404], Point [x=-122.262509, y=37.793512]]

GEODIST获取两点之间的距离

官方文档: https://redis.io/commands/geodist/

命令

GEODIST key member1 member2 [M | KM | FT | MI]

单位

  • m 米
  • km 千米
  • mi 英里
  • ft 英尺
    @Test
    public void testDist(@Autowired RedisTemplate redisTemplate) {
        Distance distance = redisTemplate.opsForGeo()
                .distance(positionKey, "10003:科学中心", "10004:博物馆", RedisGeoCommands.DistanceUnit.KILOMETERS);
        System.out.println(distance);
    }

执行结果

2.3219 KILOMETERS

GEOHASH获取坐标的hash

官方文档: https://redis.io/commands/geohash/

GEOHASH key [member [member ...]]

这里给定的10005不存在

    @Test
    public void testGeoHash(@Autowired RedisTemplate redisTemplate) {
        List<String> results = redisTemplate.opsForGeo()
                .hash(positionKey, "10004:博物馆", "10002:百货大楼", "10005:欢乐海岸");
        System.out.println(results);
    }

执行结果

[9q9p1b55jj0, 9q9p1drt380, null]

ZREM 移除位置

官方没有GEODEL,需要使用ZREM命令

官方文档: https://redis.io/commands/zrem/

 @Test
    public void testGeoRemove(@Autowired RedisTemplate redisTemplate) {
        Long remove = redisTemplate.opsForGeo().remove(positionKey, "10002:百货大楼");
        List<String> results = redisTemplate.opsForGeo()
                .hash(positionKey, "10004:博物馆", "10002:百货大楼", "10005:欢乐海岸");
        System.out.println(results);
    }

执行结果,可以看到10002百货大楼已经被移除了。

[9q9p1b55jj0, null, null]

注意: redis geo没有GEODEL命令,需要使用ZREM命令删除元素

数学球面计算两点距离

/**
 * 通过球面计算距离
 */
public class DistanceUtil {

    /**
     * 赤道半径(m)
     */
    public final static double RC = 6378137;

    /**
     * 极半径(m)
     */
    public final static double RJ = 6356725;

    /**
     * 将角度转化为弧度
     */
    public static double radians(double d) {
        return d * Math.PI / 180.0;
    }

    /**
     * 根据两点经纬度((longitude and latitude))坐标计算直线距离
     * <p>
     * S = 2arcsin√sin²(a/2)+cos(lat1)*cos(lat2)*sin²(b/2) ̄*6378137
     * <p>
     * 1. lng1 lat1 表示A点经纬度,lng2 lat2 表示B点经纬度;<br>
     * 2. a=lat1 – lat2 为两点纬度之差 b=lng1 -lng2 为两点经度之差;<br>
     * 3. 6378137为地球赤道半径,单位为米;
     *
     * @param longitude1 点1经度
     * @param latitude1  点1纬度
     * @param longitude2 点2经度
     * @param latitude2  点2纬度
     * @return 距离,单位米(M)
     * @see <a href=
     * "https://zh.wikipedia.org/wiki/%E5%8D%8A%E6%AD%A3%E7%9F%A2%E5%85%AC%E5%BC%8F">
     * 半正矢(Haversine)公式</a>
     */
    public static double getDistanceFromToLngLat(double longitude1, double latitude1, double longitude2, double latitude2) {
        // 将角度转化为弧度
        double radLongitude1 = radians(longitude1);
        double radLatitude1 = radians(latitude1);
        double radLongitude2 = radians(longitude2);
        double radLatitude2 = radians(latitude2);

        double a = radLatitude1 - radLatitude2;
        double b = radLongitude1 - radLongitude2;

        return 2 * Math.asin(Math.sqrt(Math.sin(a / 2) * Math.sin(a / 2)
                + Math.cos(radLatitude1) * Math.cos(radLatitude2) * Math.sin(b / 2) * Math.sin(b / 2))) * (RC);
    }

    /**
     * 获取指定角度方向上的经纬度(longitude and latitude)<br>
     * 以原始点的经纬度为基点,构建XY二维坐标线,则angle角度则从x轴起算。<br>
     * 说明:LBS查找,东西南北四个方向的最远点,构建矩形,在矩形框方位内, 才有可能是该距离方位内的坐标,然后利用距离公式从小范围内找坐标
     *
     * @param origLongitude    基点经度
     * @param origLatitude     基点纬度
     * @param distance         距离(m)
     * @param angle            角度(0~360)
     * @param 经纬度(该角度指定距离的经纬度)
     */
    public static Coordinate getCoordinate(double origLongitude, double origLatitude, double distance, double angle) {
        double x = distance * Math.sin(angle * Math.PI / 180.0);
        double y = distance * Math.cos(angle * Math.PI / 180.0);
        double r = RJ + (RC - RJ) * (90.0 - origLongitude) / 90.0;//由于地球不是标准的球体,中间粗,两头细,这里計算平均半徑r
        double d = r * Math.cos(origLongitude * Math.PI / 180);
        double newLongitude = (y / r + origLongitude * Math.PI / 180.0) * 180.0 / Math.PI;
        double newLatitude = (x / d + origLatitude * Math.PI / 180.0) * 180.0 / Math.PI;
        return new Coordinate(newLongitude, newLatitude);
    }
}

测试用例,用例的经纬度为GEOSEARCH示例中目标到科学中心的距离

  @Test
    void getDist() {
        double longitude1 = -122.2612767;
        double latitude1 = 37.793684;
        double longitude2 = -122.2469854;
        double latitude2 = 37.8104049;
        double distance = DistanceUtil.getDistanceFromToLngLat(longitude1, latitude1, longitude2, latitude2);
        System.out.println("经纬度(" + longitude1 + "," + latitude1 + ")到(" + longitude2 + "," + latitude2 + ")的距离为: " + distance + " 米");
    }

运行测试用例,返回结果与GEO返回的结果基本吻合。

经纬度(-122.2612767,37.793684)(-122.2469854,37.8104049)的距离为: 2246.057783614703

在这里插入图片描述

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

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

相关文章

SLMi8230BDCG-DG兼容Si8230BD-BS-IS 通过CQC认证隔离驱动方案探索

SLMi8230BDCG-DG 双通道1A 5.0kVRMS隔离栅极驱动器是一种具有不同配置的隔离双通道栅极驱动器。配置为高侧/低侧驱动器&#xff0c;峰值 电源 输出电流为1.0A&#xff0c;具有可编程死区&#xff08;DT&#xff09;功能。将DIS引脚拉高会同时关闭两个输出&#xff0c;并允许在D…

多合一iPhone 解锁工具:iMyFone LockWiper iOS

多合一iPhone 解锁工具 无需密码解锁 iPhone/iPad/iPod touch 上所有类型的屏幕锁定 在几分钟内解锁 iPhone Apple ID、Touch ID 和 Face ID 立即绕过 MDM 并删除 iPhone/iPad/iPod touch 上的 MDM 配置文件 支持所有 iOS 版本和设备&#xff0c;包括最新的 iOS 17 和 iPhone 1…

XML学习及应用

介绍XML语法及应用 1.XML基础知识1.1什么是XML语言1.2 XML 和 HTML 之间的差异1.3 XML 用途 2.XML语法2.1基础语法2.2XML元素2.3 XML属性2.4XML命名空间 3.XML验证3.1xml语法验证3.2自定义验证3.2.1 XML DTD3.2.2 XML Schema3.2.3PCDATA和CDATA区别3.2.4 参考 1.XML基础知识 1…

python:五种算法(DBO、WOA、GWO、PSO、GA)求解23个测试函数(python代码)

一、五种算法简介 1、蜣螂优化算法DBO 2、鲸鱼优化算法WOA 3、灰狼优化算法GWO 4、粒子群优化算法PSO 5、遗传算法GA 二、5种算法求解23个函数 &#xff08;1&#xff09;23个函数简介 参考文献&#xff1a; [1] Yao X, Liu Y, Lin G M. Evolutionary programming made…

[java学习日记]反射、动态代理

目录 一.反射的简单解释与获取字节码文件对象 二.获取构造方法对象Constructor 三.反射获取字节码文件中的成员变量Field 四.反射获取字节码文件中的成员方法&#xff1a;Method 五.反射练习&#xff1a;保存信息 六.反射练习&#xff1a;利用配置文件&#xff08;存储类名…

学习通【劳动通论】2023章节练习题

社会主义核心价值观24个字是&#xff1a;富强、民主、文明、和谐&#xff0c;自由、平等、公正、法治&#xff0c;爱国、敬业、诚信、友善。 1、“富强、民主、文明、和谐”&#xff0c;是我国社会主义现代化国家的建设目标&#xff0c;也是从价值目标层面对社会主义核心价值观…

超级实用的防止商品超卖的 7 种实现方式,非常好用!

高并发场景在现场的日常工作中很常见&#xff0c;特别是在互联网公司中&#xff0c;这篇文章就来通过秒杀商品来模拟高并发的场景。 本文环境&#xff1a; SpringBoot 2.5.7 MySQL 8.0 X MybatisPlus Swagger2.9.2 模拟工具&#xff1a; Jmeter 模拟场景&#xff1a; 减库…

2000字总结—Redis常见命令

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 Redis常见命令通用命令String类型key的层级格式Hash类型List类型Set类型SortedSet类型 &#x1f48e;总结 Redis常见命令 通用命令 通过help[command]可以查看一个命令的具体用法 127.0.0.1:6379> help keysK…

鸿蒙应用开发ArkTS容器组件的使用

语雀知识库地址&#xff1a;语雀HarmonyOS知识库 飞书知识库地址&#xff1a;飞书HarmonyOS知识库 本文示例代码地址&#xff1a;Gitee 仓库地址 嗨&#xff0c;大家好&#xff0c;我是小白 上篇文章向大家介绍了 ArkTS 中我们经常使用到的几种基础组件&#xff0c;Text、Butt…

智能优化算法应用:基于教与学算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于教与学算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于教与学算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.教与学算法4.实验参数设定5.算法结果6.参考文…

【Python必做100题】之第三题(找出100以内的奇数并打印)

思路&#xff1a; 1、定义一个空列表来存储所有的奇数 2、判断是奇数就追加到列表的末尾 3、打印所有的奇数 代码如下&#xff1a; list [ ] #定义一个列表来存储所有的奇数 for i in range (1,100):if i % 2 ! 0: #判断是否为奇数list.append(i) #追加到列表的末尾 prin…

仿照MyBatis手写一个持久层框架学习

首先数据准备&#xff0c;创建MySQL数据库mybatis&#xff0c;创建表并插入数据。 DROP TABLE IF EXISTS user_t; CREATE TABLE user_t ( id INT PRIMARY KEY, username VARCHAR ( 128 ) ); INSERT INTO user_t VALUES(1,Tom); INSERT INTO user_t VALUES(2,Jerry);JDBC API允…

《信息技术时代》期刊杂志论文发表投稿

《信息技术时代》期刊收稿方向&#xff1a;通信工程、大数据、计算机、办公自动化、信息或计算机教育、电子技术、系统设计、移动信息、图情信息研究、人工智能、智能技术、信息技术与网络安全等。 刊名&#xff1a;信息技术时代 主管主办单位&#xff1a;深圳湾科技发展有限…

【sgAutocomplete】自定义组件:基于elementUI的el-autocomplete组件开发的自动补全下拉框组件(带输入建议的自动补全输入框)

特性&#xff1a; 1、支持本地保存选中过的记录 2、支持动态接口获取匹配下拉框内容 3、可以指定对应的显示label和字段组件key 4、自动生成速记符字段&#xff08;包含声母和全拼两种类型&#xff09;&#xff0c;增强搜索匹配效率 sgAutocomplete源码 <template><!…

API接口并发测试:如何测试API接口的最大并发能力?

本文将深入探讨API接口并发测试&#xff0c;介绍并比较不同的API并发测试工具&#xff0c;并分享如何有效测量和提高API接口在最大并发情况下的性能。了解如何应对高并发压力是保证系统稳定性和用户满意度的关键&#xff0c;让我们一起来探索这个重要的话题。 随着互联网的迅速…

selenium库的使用

来都来了给我点个赞收藏一下再走呗&#x1f339;&#x1f339;&#x1f339;&#x1f339;&#x1f339; 目录 一、下载需要用到的python库selenium 二、selenium的基本使用 1.在python代码引入库 2.打开浏览器 3.元素定位 1&#xff09;通过id定位 2&#xff09;通过标…

计算机组成原理-指令寻址

指令寻址 指令 寻址下一条欲执行指令的地址&#xff08;始终由程序计数器PC给出) 顺序寻址 &#xff08;PC&#xff09;“1”-> PC 这里的1理解为1个指令字长&#xff0c;实际加的值会因指令长度、编址方式而不同 **跳跃寻址 **由转移指令指出 数据寻址 确定 本条指令 的…

AttributeError: module ‘lib‘ has no attribute ‘X509_V_FLAG_CB_ISSUER_CHECK‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【Android12】Android Framework系列--AMS启动Activity分析

AMS启动Activity分析 通过ActivityManagerService(AMS)提供的方法&#xff0c;可以启动指定的Activity。比如Launcher中点击应用图标后&#xff0c;调用AMS的startActivity函数启动应用。 AMS提供的服务通过IActivityManager.aidl文件定义。 // frameworks/base/core/java/an…

智能优化算法应用:基于郊狼算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于郊狼算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于郊狼算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.郊狼算法4.实验参数设定5.算法结果6.参考文献7.MA…