Найти пользователей, находящихся между указанным расстоянием (используя почтовый индекс пользователя) - PullRequest
3 голосов
/ 04 августа 2010

Есть ли способ найти радиальное расстояние, используя почтовый индекс?

Моя задача - найти всех пользователей, находящихся на указанном расстоянии.Я знаю почтовые индексы пользователей.

Например, пользователи между 25 милями от текущего местоположения.

У меня есть другие категории поиска, для которых я использую MySQL запросы.Я не могу ничего понять для вопроса о расстоянии.

Мой бэкэнд в php и frontend во Flex.

Для меня лучшим вариантом будет что-то вроде www.zip-codes.com/zip-code-radius-finder.asp,т.е. если я смогу получить все почтовые индексы, доступные на указанном радиальном расстоянии.Так что я могу сравнить эти почтовые индексы с почтовыми индексами пользователей в моей базе данных.И выберите те, которые соответствуют.

Пожалуйста, помогите мне с этим.Zeeshan

Ответы [ 5 ]

8 голосов
/ 04 августа 2010

Я совершил нечто подобное, используя бесплатный API Карт Google - который может быть достаточно хорош для ваших нужд

http://googlemapsapi.blogspot.com/2006/06/geocoding-at-last.html - краткий пост по теме (с 2006 г.)

http://code.google.com/apis/maps/index.html - главная страница Google Maps API

6 голосов
/ 04 августа 2010

Почтовые индексы не отображаются напрямую на расстоянии друг от друга. Вам нужно будет получить почтовый индекс и данные широты / долготы, найти там почтовые индексы и сравнить расстояние между координатами широты и долготы. В зависимости от местности могут быть доступны бесплатные данные, но очень часто можно купить такую ​​таблицу или подписаться на возможно платный веб-сервис, который выполняет перевод почтового индекса в лат / лонг или в соседние почтовые индексы.

2 голосов
/ 21 июля 2011

Вы можете сделать все это только с помощью базы данных

  1. Скачать бесплатную геокодированную базу данных почтовых индексов США ( как этот )
  2. Перетащите их в свою базу данных.
  3. Напишите простую функцию sql для сравнения двух почтовых индексов (например, ZIP_DIST (zip1, zip2))
  4. Поиск по списку почтовых индексов людей и сортировка поВышеприведенная функция, сравнивающая все почтовые индексы с целевым почтовым индексом.
  5. Наконец, верните N ближайших значений.

Таким образом, все выполняется и кэшируется на вашем уровне MySQL.API не требуется.

2 голосов
0 голосов
/ 02 сентября 2010

конечно, вы можете реализовать часть кода из Google API, но здесь - небольшой проект, который я написал для вас, и он выглядит следующим образом: 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>
...