0

假设像 Foursquare 这样的服务,我想保存签到的位置。我应该将其保存为经纬度还是地址/区域名称,例如 123 Portmill St, NY 12345 或 SoHo, NY。在第一种情况下,我可以让用户输入地址,然后我的服务会查找并存储经纬度信息。通过这样做,我的服务可以搜索多边形边界内的签到。

而在第二种情况下,我可以将位置存储为存储桶并避免冗余信息,例如 (lat,long) = (100000.1,100000.1), (100000.2,100000.2),它们非常靠近,甚至可以被视为同一个位置。

4

2 回答 2

0

我认为我没有完全理解您尝试做的事情的细微差别,但计算机通常更适合使用纬度和经度等数字,而不是人类可读的文本信息。例如,对于文本地址,您将如何确保一致性,例如处理额外的空格、ZIP+4 代码,而不仅仅是较短的邮政编码等。

我想这只是我的直觉,纬度和经度可能比文字更好。在我住在英国的地方,有很多城镇和城市有两条同名道路的例子,所以我确实认为存储文本而不是纬度/经度可能会有更多的陷阱。

于 2013-05-14T22:53:40.117 回答
0

这个怎么样。我会在数据库中存储 3 列,即 (Latitude, Longitude, TextLocation),但它是对 (Latitude, Longitude) 被视为表的键。当地理编码器被要求输入与给定(纬度、经度)相对应的文本时,TextLocation 只是反向地理编码器的最后一个已知结果。

当一个新位置(New_Latitude,New_Longitude)到达时,我会搜索数据库以查找数据库中所有最近的行。要计算 (New_Latitude, New_Longitude) 到 (Latitude, Longitude) 的距离,我将使用以下代码

float LatDiff = New_Latitude - Latitude;
float LongDiff = New_Longitude - Longitude;
float CosNewLat = Math.cos(New_Latitude);
float ConversionFac = 6371000 * Math.PI / 180; // 6371000 is earth radius in metres
float Dist_metres = ConversionFac * Math.sqrt(LatDiff*LatDiff + LongDiff*LongDiff*CosNewLat*CosNewLat);

然后对于每个最接近(New_Latitude,New_Longitude)的点,我将使用反向地理编码更新数据库中的 TextLocation。如果新位置与任何现有位置的当前反向地理编码不匹配,我会将其添加到数据库中。

我的部分想法是,即使存储包含一列文本的 3 列,与现代存储容量相比,数据库仍然很小。

于 2013-05-17T11:26:48.803 回答