在ANSI SQL兼容数据库中存储纬度或经度数据时,哪种数据类型最合适?应该float使用,或decimal,或......?
我知道Oracle,MySql和SQL Server已经添加了一些专门用于处理地理数据的特殊数据类型,但我对如何将信息存储在"普通的"SQL数据库中感兴趣.
我正在使用地图数据,并Latitude/Longitude扩展到8位小数.例如:
Latitude 40.71727401
Longitude -74.00898606
Run Code Online (Sandbox Code Playgroud)
我在Google文档中看到 它使用:
lat FLOAT( 10, 6 ) NOT NULL,
lng FLOAT( 10, 6 ) NOT NULL
Run Code Online (Sandbox Code Playgroud)
但是,它们的小数位只有6个.
我应该使用FLOAT(10, 8)还是有另一种方法来考虑存储这些数据,这样才能准确.它将与地图计算一起使用.谢谢!
我在这里读到这个问题:
在SQL数据库中存储纬度和经度数据时要使用的数据类型是什么?
似乎普遍的共识是使用Decimal(9,6)是要走的路.对我来说,问题是,我真的需要这么准确吗?
例如,Google的API会返回如下结果:
"lat": 37.4219720,
"lng": -122.0841430
Run Code Online (Sandbox Code Playgroud)
超出-122.0841430,我需要多少位数?我已经阅读了几本指南,但我无法从中得到足够的理解来解决这个问题.
更确切地说,在我的问题中:如果我想在精确位置50英尺范围内准确,我需要存储多少小数点?
也许一个更好的问题实际上是一个非编程问题,但它会是:每个小数点给你多少准确?
这很简单吗?
我应该将纬度和经度存储为字符串或浮点数(或其他内容)吗?
(我在轨道上使用activerecord/ruby,如果这很重要的话).
表现问题......
我有一个拥有地理定位数据(经度和纬度)的房屋数据库.
我想要做的是找到使用InnoDB数据库引擎将位置数据存储在我的MySQL(v5.0.24a)中的最佳方法,以便我可以执行大量查询,其中我将返回所有之间的所有主记录x1和x2 latitude以及y1和y2 longitude.
现在,我的数据库架构是
---------------------
Homes
---------------------
geolat - Float (10,6)
geolng - Float (10,6)
---------------------
Run Code Online (Sandbox Code Playgroud)
我的疑问是:
SELECT ...
WHERE geolat BETWEEN x1 AND x2
AND geolng BETWEEN y1 AND y2
Run Code Online (Sandbox Code Playgroud)
更新:仍然没有答案
我在下面有3个不同的答案.一个人说要用Float.一个人说要使用INT.一个人说要使用Spatial.
所以我使用MySQL"EXPLAIN"语句来衡量SQL的执行速度.如果使用INT或FLOAT用于经度和纬度数据类型,似乎绝对没有SQL执行(结果集提取)的差异.
使用" BETWEEN"语句似乎比使用" >"或" <"SQL语句要快得多.使用" BETWEEN"比使用" >"和" <"语句快近3倍.
话虽如此,我仍然不知道如果使用Spatial会对性能产生什么影响,因为我不清楚它是否支持我运行的MySQL版本(v5.0.24)......以及我如何支持它如果支持.
任何帮助都会受到极大的欢迎
在像C,C++或D这样的系统级编程语言中,用于存储纬度和经度的最佳类型/编码是什么?
我看到的选项是:
deg = (360/2^32)*val简易解决方案(FP)具有主要的缺点,它具有非常均匀的分辨率(在英格兰的某个地方,它可以以微米为单位测量,在日本测量,它不能).这也有FP比较等所有问题.其他选项需要在数据生命周期的不同部分进行额外的努力.(代,演示,计算等)
一个有趣的选择是浮动精度类型,其中随着纬度增加它获得更多位并且经度变得更少(当它们朝向极点靠近时).
相关问题并不完全涵盖这一点:
顺便说一句:32位在赤道上提供大约0.3英寸的E/W分辨率.这接近于高等级GPS设置可以工作的规模(IIRC,它们在某些模式下可以降至约0.5英寸).
OTOH如果32位均匀分布在地球表面,你可以在一边为大约344m的正方形,5 Bytes给21m,6B-> 1.3m和8B-> 5mm.
我现在没有特定的用途,但之前已经使用过这种东西,并且在某些时候再次期待.
我在我的MySQL数据库中有经度和纬度坐标(GPS数据).
它目前存储为:
column type
------------------------
geolat decimal(10,6)
geolng decimal(10,6)
Run Code Online (Sandbox Code Playgroud)
问题: 我是否真的需要一个decimal(10,6)与正确存储坐标数据一样大的数据类型?
由于我在经度和纬度上有一个综合索引,因此这个索引大小很大.如果我可以在不牺牲任何东西的情况下缩小它,那就太好了.
我正在尝试使用Core Location,MapKit和Core Data框架保存位置并在地图上检索位置.
我所做的是我刚刚创建了名为POI的实体并添加了诸如纬度(双重类型),经度(双重类型)等属性.
简单地说,我的应用程序使用两个NSNumber保存POI.(lat和long)但我觉得必须有一个更聪明的方法来存储CLLocation.
干杯.
我想将从Google Maps GeoCoding API获取的纬度和经度值存储在MySQL数据库中.值为浮点格式.
12.9274529
77.5905970
当我想将它存储在数据库(数据类型为float)时,它会向上舍入浮动并以下列格式存储它:
12.9275
77.5906
我使用了错误的数据类型吗?如果是,那么我应该使用什么数据类型来存储纬度和经度值?
更新:
这是Allin要求的CREATE TABLE
CREATE TABLE `properties` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL,
`description` text,
`latitude` float DEFAULT NULL,
`longitude` float DEFAULT NULL,
`landmark` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `serial` (`serial`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
Run Code Online (Sandbox Code Playgroud) 这可能会也可能不会很清楚,如果我不在基础上,或者您需要更多信息,请给我留言.也许有一个解决方案已经在我想要的PHP中.
我正在寻找一个函数,它将增加或减去经度OR纬度值的距离.
原因:我有一个包含所有纬度和经度的数据库,并希望形成一个查询来提取X公里(或英里)内的所有城市.我的查询看起来像这样......
Select * From Cities Where (Longitude > X1 and Longitude < X2) And (Latitude > Y1 and Latitude < Y2)
Where X1 = Longitude - (distance)
Where X2 = Longitude + (distance)
Where Y1 = Latitude - (distance)
Where Y2 = Latitude + (distance)
Run Code Online (Sandbox Code Playgroud)
我在PHP中工作,使用MySql数据库.
也欢迎任何建议!:)
mysql ×6
types ×4
database ×3
sql ×2
activerecord ×1
cllocation ×1
coordinates ×1
core-data ×1
distance ×1
encoding ×1
geocoding ×1
geolocation ×1
gis ×1
gps ×1
iphone ×1
performance ×1
php ×1
rdbms ×1
save ×1
store ×1