查找位于指定距离之间的用户(使用用户的邮政编码)

时间:2010-08-04 00:04:22

标签: php mysql flex actionscript

有没有办法使用邮政编码找到径向距离?

我的任务是搜索居住在指定距离内的所有用户。我知道用户的zipcodes。

例如,距离当前位置25英里的用户。

我有其他搜索类别,我正在使用mysql查询。我无法解决距离问题。

我的后端是在php中 和Flex前端。

对我而言,最好的选择就是www.zip-codes.com/zip-code-radius-finder.asp。即,如果我能够在指定的径向距离内获得所有可用的邮政编码。所以我可以将此邮政编码与我数据库中的用户邮政编码进行比较。并选择匹配的。

请帮我解决这个问题。 Zeeshan

5 个答案:

答案 0 :(得分:8)

我使用免费的Google Maps API完成了类似的工作 - 这可能足以满足您的需求

http://googlemapsapi.blogspot.com/2006/06/geocoding-at-last.html - 关于这个问题的简短发表(自2006年起)

http://code.google.com/apis/maps/index.html - Google Maps API主页

答案 1 :(得分:6)

邮政编码不直接映射到彼此的距离。你必须获得邮政编码和lat / long数据,在那里查找邮政编码,并比较纬度/经度坐标之间的距离。根据当地情况,可以获得免费数据,但购买此类表格或订阅可能付费的网络服务非常常见,该网络服务会将邮政编码转换为纬度/经度或相邻邮政编码。

答案 2 :(得分:2)

答案 3 :(得分:2)

您只需使用数据库即可完成所有这些操作

  1. 下载美国邮政编码(like this one
  2. 的免费地理编码数据库
  3. 将它们放入数据库
  4. 编写一个简单的sql函数来比较两个拉链(即ZIP_DIST(zip1,zip2))
  5. 搜索人们的拉链列表,并按上述功能排序,将每个人的拉链与目标拉链进行比较。
  6. 最后返回N个最接近的值。
  7. 这样一切都在MySQL层运行和缓存。无需API。

答案 4 :(得分:0)

当然,你可以使用Google 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>