在使用MySQL进行开发时,有时需要存储经纬度信息,而MySQL并没有任何现成的经纬度类型可用,在列存储类型中有Varchar和Text,但是并不能满足经纬度的存储需求。下面介绍如何使用MySQL存储经纬度类型的方法:
一、创建数据表
使用MySQL中的查询语句来创建一个经纬度字段的数据表,并定义一个精度为8位的十六进制字符串字段,名称为latlng,例如:
CREATE TABLE ` loc ` (
` id ` int ( 11) NOT NULL AUTO_INCREMENT,
` latlng ` char ( 16 ) NOT NULL,
PRIMARY KEY (` id `)
) ENGINE = INNODB CHARACTER SET = utf8;
二、使用坐标转换函数
将经纬度信息转换成十六进制的格式,例如:
// 将经纬度信息转换成十六进制
$lat = "40.1234567";
$lng = "-90.9876543";
$lat_hex_b = dechex(round($lat * 1000000));
$lat_hex_e = dechex((($lat* 1000000) - round($lat* 1000000))* pow(16, 8));
$lng_hex_b = dechex(round($lng * 1000000));
$lng_hex_e = dechex((($lng* 1000000) - round($lng* 1000000))* pow(16, 8));
$latlng_hex = $lat_hex_b.$lat_hex_e." ".$lng_hex_b.$lng_hex_e
然后将转换后的结果插入到数据库当中:
$sql = "insert into `loc` (` latlng `) values ('$latlng_hex ')";
$res = mysql_query($sql);
三、使用查询函数
通过十六进制的字符串解析出经纬度的值,例如:
SELECT * FROM `loc`
$latlng_hex = $row ['latlng'];
$lat_hex_b = substr($latlng_hex, 0, 8);
$lat_hex_e = substr($latlng_hex, 8, 8);
$lng_hex_b = substr($latlng_hex, 16, 8);
$lng_hex_e = substr($latlng_hex, 24, 8);
$lat = hexdec($lat_hex_b) + hexdec($lat_hex_e)/ pow(16, 8);
$lng = hexdec($lng_hex_b) + hexdec($lng_hex_e)/ pow(16, 8);
四、总结
以上就是使用MySQL存储经纬度类型的方法,可以让数据库更加灵活,方便存储浮点数也可以提升数据存储的空间效率,可以用于系统地理定位等场景。