check经纬度

本文提供了一种使用PHP正则表达式验证经纬度有效性的方法。包括两个函数:一个是验证纬度的有效性,另一个是验证经度的有效性。这些函数可以帮助开发者确保地理坐标数据的准确性。
纬度check
  function is_map_latitude($text) {

    $pattern = '/^[\-\+]?([0-8]?\d{1}\.\d{1,5}|90\.0{1,5})$/';

    if(preg_match($pattern, $text)){

      return TRUE;
    }else{

      return FALSE;
    }
  }

经度check
  function is_map_longitude($text) {

    $pattern = '/^[\-\+]?(0?\d{1,2}\.\d{1,5}|1[0-7]?\d{1}\.\d{1,5}|180\.0{1,5})$/';

    if(preg_match($pattern, $text)){

      return TRUE;
    }else{

      return FALSE;
    }
  }
六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)内容概要:本文档围绕六自由度机械臂的ANN人工神经网络设计展开,详细介绍了正向与逆向运动学求解、正向动力学控制以及基于拉格朗日-欧拉法推导逆向动力学方程的理论与Matlab代码实现过程。文档还涵盖了PINN物理信息神经网络在微分方程求解、主动噪声控制、天线分析、电动汽车调度、储能优化等多个工程与科研领域的应用案例,并提供了丰富的Matlab/Simulink仿真资源和技术支持方向,体现了其在多学科交叉仿真与优化中的综合性价值。; 适合人群:具备一定Matlab编程基础,从事机器人控制、自动化、智能制造、电力系统或相关工程领域研究的科研人员、研究生及工程师。; 使用场景及目标:①掌握六自由度机械臂的运动学与动力学建模方法;②学习人工神经网络在复杂非线性系统控制中的应用;③借助Matlab实现动力学方程推导与仿真验证;④拓展至路径规划、优化调度、信号处理等相关课题的研究与复现。; 阅读建议:建议按目录顺序系统学习,重点关注机械臂建模与神经网络控制部分的代码实现,结合提供的网盘资源进行实践操作,并参考文中列举的优化算法与仿真方法拓展自身研究思路。
<think>我们通常使用MySQL来存储经纬度信息,并且可能会进行地理位置的计算(如计算两点之间的距离)。在MySQL中,我们可以使用`POINT`数据类型来存储经纬度,这样可以利用空间索引进行高效查询。此外,也可以使用两个浮点数字段(如`DECIMAL`)分别存储经度和纬度。但是,使用`POINT`数据类型是更符合规范且能利用空间函数的方法。以下是两种方式的对比:1.使用两个单独的字段(例如:`lat`和`lng`),类型为`DECIMAL(10,8)`(因为经度和纬度通常需要较高的精度)。2.使用一个`POINT`类型的字段,它能够存储一个二维坐标。使用`POINT`类型的好处:-可以使用MySQL的空间扩展(SpatialExtension)功能,例如`ST_Distance_Sphere`函数来计算球面距离。-可以创建空间索引(SPATIALINDEX)来加速某些查询。使用两个单独的字段的好处:-简单直观,易于理解。-不需要使用空间扩展,兼容性可能更好(但MySQL5.7以上版本都支持空间扩展)。考虑到地理位置查询的效率,特别是当数据量大时,使用空间索引会显著提高性能。因此,推荐使用`POINT`类型。下面我们分别展示两种方式:方式一:使用两个单独的字段(lat和lng)```sqlCREATE TABLE`locations` (`id`INT AUTO_INCREMENT PRIMARYKEY,`name`VARCHAR(255)NOT NULL,`lat` DECIMAL(10,8) NOTNULL,--纬度`lng`DECIMAL(10,8)NOT NULL--经度); ```方式二:使用POINT类型```sqlCREATE TABLE`locations` (`id`INT AUTO_INCREMENT PRIMARYKEY,`name`VARCHAR(255)NOT NULL,`coords`POINTNOT NULL,SPATIAL INDEX(`coords`)--创建空间索引);```注意:在MySQL中,使用空间索引要求表的存储引擎为MyISAM或InnoDB(MySQL5.7.4及以上版本InnoDB支持空间索引)。这里我们使用InnoDB。插入数据时,对于POINT类型,我们可以使用ST_GeomFromText函数或者Point函数: ```sqlINSERT INTO`locations`(`name`, `coords`) VALUES('Location1',ST_GeomFromText('POINT(40.7128-74.0060)')); --或者INSERTINTO `locations`(`name`, `coords`) VALUES('Location2', POINT(40.7128, -74.0060)); ```计算两个点之间的距离(单位:米):```sqlSELECTST_Distance_Sphere(POINT(40.7128,-74.0060),POINT(34.0522,-118.2437))AS distance_in_meters;```如果我们需要查询某个点附近一定距离内的地点,可以使用如下查询(例如:查找距离(40.7128, -74.0060)1000米内的地点): ```sqlSELECT *FROM`locations`WHERE ST_Distance_Sphere(`coords`,POINT(40.7128,-74.0060))<=1000; ```但是,注意这种查询在数据量大时可能会很慢,即使有空间索引,因为MySQL的空间索引在距离计算上并不总是使用索引(在5.7版本中,ST_Distance_Sphere函数本身不能使用索引)。因此,我们通常先使用一个矩形框进行初步筛选,然后再计算精确距离。改进的查询(使用MBRContains和MBRWithin等函数可以利用空间索引):```sqlSELECT*FROM `locations`WHERE MBRContains(ST_Buffer(POINT(40.7128,-74.0060),1000 /(111000 /2)), --粗略地将米转换为度(近似值,赤道1度约111公里),这里除以111000将米转换为度,然后取一半作为缓冲(因为经度在不同纬度上长度不同,这里只是近似)`coords` )AND ST_Distance_Sphere(`coords`,POINT(40.7128,-74.0060))<=1000; ```但是,上述方法中的ST_Buffer在MySQL中并不直接支持,所以我们需要自己构建一个矩形范围(bounding box)。我们可以计算给定点周围一定距离(例如1000米)的大致经纬度偏移量。一个更常见的做法是计算一个矩形框(使用经度和纬度的偏移量):纬度偏移:1度大约111公里,所以1000米大约是1000/111000≈0.009009度经度偏移:同样距离的经度偏移与纬度有关,需要乘以cos(纬度),所以1000米在纬度40度处大约是1000/(111000 *cos(40*π/180)) ≈1000/(111000*0.766)≈0.01176度然后查询: ```sqlSET @center =POINT(40.7128,-74.0060);SET @radius =1000;--1000米SET@lat_degrees= @radius /111000;SET @lng_degrees= @radius /(111000 *COS(RADIANS(40.7128)));SELECT *FROM `locations`WHEREMBRContains(ST_MakeEnvelope(POINT(40.7128 -@lat_degrees, -74.0060- @lng_degrees),POINT(40.7128 +@lat_degrees, -74.0060+ @lng_degrees)),`coords`)AND ST_Distance_Sphere(`coords`,@center)<= @radius;```这样,先通过矩形框(MBR)利用空间索引快速筛选出可能符合条件的点,然后再计算精确距离,这样效率更高。总结:对于存储经纬度,推荐使用`POINT`类型,并创建空间索引,以便进行高效的空间查询。然而,如果应用场景简单,且数据量不大,也可以使用两个浮点字段。但是,两个浮点字段的方式无法使用空间索引,所以在大量数据时性能较差。根据需求选择合适的方式。下面给出一个完整的创建表和插入数据的例子(使用POINT类型):</think>在 MySQL 中存储经纬度数据时,推荐使用空间数据类型来实现高效的地理位置查询和计算。以下是详细解决方案: ### 推荐方案:使用 `POINT` 空间数据类型 ```sql CREATE TABLE locations ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, coordinates POINT NOT NULL SRID 4326, -- WGS84坐标系 SPATIAL INDEX(coordinates) -- 创建空间索引 ) ENGINE=InnoDB; ``` #### 关键解释: 1. **`POINT` 数据类型**: - 专门用于存储地理坐标(经度+纬度) - `SRID 4326` 指定使用 WGS84 坐标系(全球通用GPS坐标系) 2. **空间索引**: - 使用 `SPATIAL INDEX` 创建索引 - 大幅提升地理位置查询性能(如距离计算、范围查询) 3. **插入数据**: ```sql -- 使用 ST_GeomFromText 函数插入 INSERT INTO locations (name, coordinates) VALUES ('Eiffel Tower', ST_GeomFromText('POINT(2.2945 48.8584)', 4326)); -- 或使用 Point 函数插入 INSERT INTO locations (name, coordinates) VALUES ('Statue of Liberty', Point(-74.0445, 40.6892)); ``` 4. **查询示例**: ```sql -- 计算两点距离(单位:米) SELECT ST_Distance_Sphere( coordinates, ST_GeomFromText('POINT(-0.1278 51.5074)', 4326) -- 伦敦坐标 ) AS distance_meters FROM locations WHERE name = 'Eiffel Tower'; -- 查询半径1公里内的地点 SELECT name FROM locations WHERE ST_Distance_Sphere( coordinates, Point(-74.0445, 40.6892) ) <= 1000; -- 1000米 ``` ### 替代方案:使用两个 `DECIMAL` 字段 ```sql CREATE TABLE locations_alt ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, latitude DECIMAL(9,6) NOT NULL, -- 范围 -90~90, 精度6位小数 longitude DECIMAL(9,6) NOT NULL, -- 范围 -180~180 INDEX (latitude, longitude) ); ``` #### 使用场景: - 简单存储坐标,不需要复杂空间计算 - 老版本 MySQL(<5.7)不支持空间函数时 #### 距离计算(Haversine公式): ```sql SELECT 6371000 * 2 * ASIN( SQRT( POW(SIN(RADIANS((lat2 - latitude)/2)), 2) + COS(RADIANS(latitude)) * COS(RADIANS(lat2)) * POW(SIN(RADIANS((lon2 - longitude)/2)), 2) ) ) AS distance FROM locations_alt; ``` ### 选择建议: | 特性 | `POINT` 类型 | `DECIMAL` 类型 | |--------------------|----------------------|---------------------| | 空间函数支持 | ✅ 完整支持 | ❌ 需手动实现 | | 查询性能 | ✅ 空间索引优化 | ⚠️ 普通索引 | | 计算复杂度 | ✅ 内置球面计算 | ⚠️ 需实现Haversine | | MySQL版本要求 | ≥5.7 | 所有版本 | | 坐标系支持 | ✅ SRID指定 | ❌ 需额外字段 | ### 最佳实践: 1. **精度选择**: - 6位小数(`DECIMAL(9,6)`)精度约 0.11米 - 满足大多数定位需求 2. **索引策略**: - 空间数据必须使用 `SPATIAL INDEX` - 普通坐标建议复合索引 `INDEX(lat, lng)` 3. **坐标系注意**: - 统一使用 SRID 4326(WGS84) - 避免混合不同坐标系 4. **数据验证**: ```sql -- 确保坐标在有效范围 ALTER TABLE locations_alt ADD CONSTRAINT chk_lat_range CHECK (latitude BETWEEN -90 AND 90), ADD CONSTRAINT chk_lng_range CHECK (longitude BETWEEN -180 AND 180); ``` 5. **性能优化**: ```sql -- 先矩形框过滤再精确计算 SELECT * FROM locations WHERE MBRContains( ST_MakeEnvelope( Point(@lng-0.01, @lat-0.01), Point(@lng+0.01, @lat+0.01) ), coordinates ) AND ST_Distance_Sphere(coordinates, Point(@lng, @lat)) <= 1000; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值