2011-08-16 27 views
1

我使用户界面显示加入与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是与里约热内卢与周围环境相匹配的参数化,在这种情况下半径有点随意选择以匹配里约热内卢而不是Sao保罗。将经度和纬度四舍五入至小数点后两位也被认为“足够好”。但是,如何在HTML和数据存储之间进行映射? HTML选项值只有一个值,经度+纬度+半径是三个值。我想找到一个涵盖所有内容的解决方案,无需添加我自己的地理代码。经度,纬度和半径是国际标准,所以自然我希望避免为地点创建我自己的ID。我可能会做一个算法,选项值的值是一个数字解码为三个值,例如选项值123456789876将解码为经度1234,纬度5678和半径9876.你能推荐任何解决方案和/或告诉我其他可能的解决方案有哪些优点和缺点?如果你想检查我所说的website,你可以通过这个链接koolbusiness.com

我想保持“兼容”与其他解决方案,如geomodel和谷歌地图,这样也允许用户选择“管理区域“,”城市“,”国家“,因为他们已经制作并更新了该结构及其比例,而我已使用Python库地理模型为我的实体启用地理位置:

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

回答

0

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

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

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

+0

非常感谢 –

1

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

+0

谢谢Jitamaro,因为它看起来像你理解的问题,我不想实现我拥有地理ID我拥有的ID。我打算研究quadkey以更好地理解你的意思。我不马上了解quadkey如何表示或编码我的位置定义(lon,lat,radius) –

2

为什么不只是做:

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

然后你可以jsondecode值以得到它的组成部分。

+0

非常好!这种解决方案的唯一缺点是与为城市,国家和其他地区(如地区代码)制作自己的ID相比,半径边界不清晰。优势在于,这种方法允许任何“类型”的位置,因为它不需要知道它是一个城市,一个国家还是一个电话区号,它可以扩展为使用定义多边形的函数进行参数化,而不仅仅是用于指定边界的半径。 –