如何表示地理位置

时间:2011-08-16 20:09:32

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

我使用户界面显示添加与Facebook的集成并启用搜索与类别和位置:

enter image description here

这给我带来了一些问题,不仅有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&lon=-43.12&r=294200这样的URL是一个匹配里约热内卢与周围环境的参数化,在这种情况下半径有点任意选择匹配Rio de Janeiro而不是圣保罗。将经度和纬度四舍五入到2位小数也被认为是“足够好”。但是如何在HTML和数据存储之间进行映射? HTML选项值只有一个值,经度+纬度+半径是三个值。我想找到一个涵盖所有内容的解决方案,而无需添加我自己的地理代码。经度,纬度和半径是国际标准,所以我自然希望避免为位置创建自己的ID。我可能会做一个算法,选项值的值是一个数字,解码为三个值,例如选项值123456789876将解码到经度1234,纬度5678和半径9876.你能推荐任何解决方案和/或告诉我其他可能的解决方案有哪些优缺点?如果您想查看我所谈论的website,您可以通过此链接koolbusiness.com

我希望与其他解决方案保持“兼容”,例如geomodel和google地图,这样也允许用户以与Google地图兼容的方式选择“管理区域”,“城市”,“国家/地区”当我使用python库地理模型为我的实体启用地理位置时,他们已经制作并更新了该结构及其竞争对象:

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

使用geomodel实现基本搜索:

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个值(lon,lat,radius)编码吗?或其他一些解决方案? 谢谢

3 个答案:

答案 0 :(得分:2)

为什么不这样做:

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

然后你可以对值进行jsondecode以获得它的组成部分。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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