2010-08-04 65 views
3

有沒有辦法使用郵政編碼查找徑向距離?查找位於指定距離之間的用戶(使用用戶的郵政編碼)

我的任務是搜索所有居住在指定距離的用戶。我知道用戶的郵編。

例如,距離當前位置25英里的用戶。

我還有其他的搜索類別中,我使用MySQL的查詢要求。我無法爲距離問題找出任何結果。

我的後臺是PHP 和前端Flex中。

對我來說,最好的辦法是類似的東西www.zip-codes.com/zip-code-radius-finder.asp的。即,如果我能夠在指定的徑向距離內獲得所有可用的郵政編碼。所以我可以將這個郵政編碼與我的數據庫中的用戶郵政編碼進行比較。並選擇一個匹配的。

請幫我解決這個問題。 Zeeshan

+1

重複的http://stackoverflow.com/questions/2349763/mysql-php-zip-code-comparison-specifically-distance/2349787#2349787 – stillstanding 2010-08-04 07:52:53

+2

什麼是賞金 - 沒有埃裏克的建議工作?您需要對所有用戶的郵編進行地理編碼,然後搜索例如使用尚未鏈接的公式,或者需要獲取所有郵編的地理編碼數據,搜索25英里內的所有郵編,然後在這些代碼中搜索數據庫中的用戶。哪種方式取決於用戶和郵編的相對數量,但除非您可以獲取全碼數據集,否則我懷疑您需要一個連接表,將所有尚未顯示的ZIP通過Google地圖映射到經緯度,然後加入反對搜索。 – Rup 2010-08-26 18:38:22

+3

郵政編碼半徑搜索:這聽起來像你應該購買他們的40美元數據集,然後從左邊的鏈接? – Rup 2010-08-26 18:55:19

回答

6

郵政編碼不直接映射到彼此的距離。您必須獲取郵政編碼&緯度/長度數據,在那裏查找郵政編碼,並比較緯度/長度座標之間的距離。根據地區的情況,免費數據可能是可用的,但購買這樣的表格非常常見,或者訂閱可能支付的web服務,將郵政編碼轉換爲lat/long或相鄰郵政編碼。

0

當然也可以實現一些從谷歌API代碼,但here是一個小項目,我爲你寫的,其外觀如下: btw i got one of services from google output like free-zipcode-maps.com/tools/zipcoderadius/extractzips2.cgi?Zip_Code=90503&Miles=30

這裏代碼:

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> 

    <s:layout> 
     <s:VerticalLayout/> 
    </s:layout> 

    <fx:Declarations> 
     <s:HTTPService id="service" resultFormat="text" result="service_resultHandler(event)" fault="Alert.show(event.fault.toString())"/> 
    </fx:Declarations> 

    <s:HGroup width="100%" 
       horizontalAlign="center" 
       verticalAlign="middle" 
       textAlign="center"> 
     <s:Label text="ZIP code"/> 
     <s:TextInput id="zip" text="90503"/> 
     <s:Label text="Radius in miles"/> 
     <s:TextInput id="miles" text="5"/> 
     <s:Button label="GO!" click="button1_clickHandler(event)"/> 
    </s:HGroup> 
    <mx:DataGrid id="dg" width="100%" height="100%"> 
     <mx:columns> 
      <mx:DataGridColumn dataField="zip" headerText="ZIP Code"/> 
      <mx:DataGridColumn dataField="distance" headerText="{'Distance in Miles from '+zip.text}"/> 
      <mx:DataGridColumn dataField="city" headerText="City"/> 
      <mx:DataGridColumn dataField="state" headerText="State"/> 
     </mx:columns> 
    </mx:DataGrid> 

    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 
      import mx.controls.Alert; 
      import mx.rpc.events.ResultEvent; 

      [Bindable] 
      public var result:Array=new Array(); 

      protected function button1_clickHandler(event:MouseEvent):void 
      { 
       service.url="http://free-zipcode-maps.com/tools/zipcoderadius/extractzips2.cgi?Zip_Code="+zip.text+"&Miles="+miles.text; 
       service.send();    
      } 

      protected function service_resultHandler(event:ResultEvent):void 
      { 
       //<textarea name="download" cols=65 rows=20> 
       //ZIP Code Distance in Miles from 90503 City State 
       //</textarea> 
       var res:String=event.result.toString(); 
       var startString:String="ZIP Code Distance in Miles from "+zip.text+" City State"; 
       var start:int=res.search(startString)+startString.length+1; 
       var end:int=res.search('</textarea>')-1; 
       res=res.substring(start,end); 

       var rows:Array=res.split("\n");    
       for each(var row:String in rows) 
       { 
        var r:Array=row.split("\t"); 
        result.push({zip:r[0],distance:r[1],city:r[2],state:r[3]}); 
       } 

       dg.dataProvider=new ArrayCollection(result); 
      } 

     ]]> 
    </fx:Script> 


</s:Application> 
2

你可以做到這一切只用數據庫

  1. 下載美國郵編的免費地理編碼數據庫(like this one
  2. 拖放到你的數據庫
  3. 寫一個簡單的SQL函數來比較兩個拉鍊(即ZIP_DIST(ZIP1,ZIP2))對你的人民拉鍊的名單和排序通過比較每個人的拉鍊給你的目標拉鍊上面的函數
  4. 搜索。
  5. 最後返回N個最接近的值。

這樣一切都運行並緩存在你的MySQL層。不需要API。

相關問題