【发布时间】:2013-02-03 15:58:02
【问题描述】:
我正在开发一个将 iOS 设备指定的 地标 存储到 MySQL 后端的小应用程序。当设备保存一个新的Placemark时,它会被插入到数据库中,并将新生成的 ID 发送回客户端。如果另一个设备尝试保存相同的 Placemark,服务器需要确定它已经存在于 DB 中,而不是插入并生成新 ID,它需要向客户端发送回该地标的现有 ID。
2 地标如果它们相同则相同:
- 姓名
- 纬度
- 经度
因此,服务器尝试通过发出
来识别提交的地标是否已经存在SELECT id FROM Placemark WHERE name=x, latitude=y, longitude=x
- 在 iOS 中,
latitude和longitude以度为单位,类型为CLLocationDegrees,由<CoreLocation>报告 - 在 MySQL 中,
latitude和longitude定义为DOUBLE
问题:
存储坐标时会丢失精度,例如:
50.09529561485427 的latidude 存储为50.0952956148543
-122.9893130423316 的longitude 存储为-122.989313042332
问题:
我可以在 MySQL 中使用不同的数据类型来完整地存储每个坐标吗?
注意事项:
- 我无法将坐标存储为
TEXT或VARCHAR,因为我需要能够说出SELECT placemarks coordinates BETWEEN x AND y,或执行其他算术选择 - 我不能使用 MySQL 的空间扩展,因为可移植性是一个问题,而且据我了解,空间数据类型在用作键时非常慢(而且我的用例需要按坐标选择)
任何帮助表示赞赏
【问题讨论】:
-
除了你的问题,在谷歌地图中输入这两个坐标会给我一个几乎相同的位置(它相差几英尺)。你真的需要这么高的准确性吗?
-
您好 DT。我建议将此问题作为stackoverflow.com/questions/12504208/… 的副本关闭——您可以很容易地使用 CLLocationDegrees 将该答案调整为您的问题。问候。
-
@Scott 请记住,我在 WHERE 子句中使用这些坐标。它们需要保持完整,不是因为我需要超级准确地识别地标,而是因为它们在后续搜索中用作键。
-
@DTs 浮点数据对于任何类型的键值都不是很好的选择——如果两个浮点数相同,甚至几乎不可能精确比较。您必须与 epsilon 进行比较。如果它依赖于保持精确值的浮点数,我会重新考虑你的程序架构。 - 如果它不用作键,而只是一个范围内的值,那么 scotts 推荐是有效的。
标签: mysql ios double core-location precision