【问题标题】:Save geolocation as latitude/longitude or address/area name?将地理位置保存为纬度/经度或地址/地区名称?
【发布时间】:2013-05-09 05:59:55
【问题描述】:

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

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

【问题讨论】:

  • 他们可以从字段中间签入吗?可能不是。我会说从最近的位置登记入住,而不是纬度/经度

标签: mysql database-design google-maps-api-3 geolocation


【解决方案1】:

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

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

【讨论】:

  • 对于那些,我可以使用谷歌反向地理编码器来输出一个地方或地区的名称或地址。由于一个区域由一堆点组成,而不是存储所有点,让数据库存储一个公共区域并使用谷歌的反向地理编码器来查找点的区域名称。
  • 你的意思是文字不是数字的?给我的消息! ;)
  • @WalterMitty 谢谢,我已经做了我希望你认为是对我的回答的适当编辑。
  • 很好的修复。我想在您的评论中补充一点,计算由纬度和经度标识的两个地方之间的空中距离很容易。文本则不然。
  • @Stochastically 那么你建议如何处理描述相同位置的冗余数据点?
【解决方案2】:

这个怎么样。我会在数据库中存储 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 列,与现代存储容量相比,数据库仍然很小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多