【问题标题】:How to represent geographical locations如何表示地理位置
【发布时间】:2011-10-28 09:37:03
【问题描述】:

我使用户界面看起来像添加与 facebook 的集成并启用将搜索与类别和位置相结合:

这给我带来了一些问题,不仅是 facebook 集成,还有位置。我不从数据存储中获取位置,我只是将它们放在纯 html 中:

<select name="w" id="searcharea">    
<option value="1" >Entire India</option>            
<option value="2" > Andaman & Nicobar Islands</option>          
<option value="3" > Andhra Pradesh</option>

等等。我们看到选项值没有意义:1,2,3 没有意义,我只是把数字放在那里。数据存储中的记录可以基于经度+纬度+半径进行匹配,例如,?lat=-22.45&amp;lon=-43.12&amp;r=294200 之类的 URL 是一种参数化,它将里约热内卢与在这种情况下随机选择半径以匹配里约热内卢和不是圣保罗。将经度和纬度四舍五入到小数点后两位也被确定为“足够好”。但是如何在 HTML 和数据存储之间进行映射?一个 HTML 选项值只有一个值,经度 + 纬度 + 半径是三个值。我想找到一个涵盖所有内容的解决方案,而无需添加我自己的地理代码。经度、纬度和半径是国际标准,所以我自然希望避免为位置创建自己的 ID。我可能可以制定一个算法,选项值的值是一个解码为三个值的数字,例如选项值 123456789876 将解码为经度 1234、纬度 5678 和半径 9876。你能推荐任何解决方案和/或告诉我其他可能的解决方案有哪些优点和缺点?如果你想查看我所说的website,你可以通过这个链接koolbusiness.com

我希望与其他解决方案(例如地理模型和谷歌地图)保持“兼容”,因此还允许用户以与谷歌地图兼容的方式选择“行政区域”、“城市”、“国家”,因为当我使用 python 库 geomodel 为我的实体启用地理时,他们已经制作并更新了该结构及其内容:

class A(GeoModel,search.SearchableModel):      
    primary_image=blobstore.BlobReferenceProperty() 
    postaladress=db.PostalAddressProperty(indexed=False,verbose_name="postaladdress")
    ...

使用地理模型作品实现基本搜索:

m=int(self.request.get('r')) if self.request.get('r') else 804670#radius
lat = self.request.get('lat')
lon = self.request.get('lon')
articles = A.proximity_fetch(A.all(),db.GeoPt(lat, lon),max_results=PAGESIZE+1, max_distance=m)
articles = sorted(articles, key=lambda x: x.modified, reverse=True)

但是由于选项值只接受一个值,如何将视图与后端集成?我应该将 3 个值(经度、纬度、半径)编码为单个值吗?还是其他解决方案? 谢谢

【问题讨论】:

    标签: python html google-app-engine google-maps geocoding


    【解决方案1】:

    您很可能会寻找四键。四键是空间索引或空间填充曲线。它看起来像四叉树或分形,并将 2d 复杂度降低到 1d 复杂度。 Google-Maps 和 Bing-Maps 使用 z 曲线,因为它很容易解决。希尔伯特曲线在空间填充方面更好,但更难求解。 quadkey 的想法是从左到右搜索图块及其位置。例如,如果您的四键是 12333222244,您可以搜索 1233* 并从该图块中以及该图块之后或之下获取所有位置,因为它是一个树数据结构。

    【讨论】:

    • 谢谢 Jitamaro,因为您似乎理解了我不想为地理实现我自己的 ID 的问题。我将研究 quadkey 以更好地理解您的意思。我不马上明白四键如何表示或编码我对位置的定义(经度、纬度、半径)
    【解决方案2】:

    为什么不直接做:

    <option value="{lat:-22.45,long:-43.12,r:294200}">Rio De Janeiro</option>
    

    然后你可以jsondecode这个值来获取它的组成部分。

    【讨论】:

    • 太棒了!与为城市、国家和其他区域(例如区号)制作自己的 ID 相比,此解决方案的唯一缺点是半径边界不清晰。最大的优势是这种方法允许任何“类型”的位置,因为它不需要知道它是城市、国家还是电话区号,并且可以使用定义多边形的函数扩展它来参数化,而不仅仅是指定边界的半径。
    【解决方案3】:

    最简单的方法是在代码的配置文件中定义一个查找表。例如:

    location_map = {
      1: {'name': Rio De Janeiro', 'lat': -22.45, 'long': -43.12, 'radius': 294200},
      # ...
    }
    

    然后,您可以简单地使用选项值作为您在数组中查找值的键。您还可以使用此数组通过迭代它并输出名称/值对来生成表单字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多