Поиск полного адреса по почтовому индексу, каково решение?

#php #codeigniter #lookup #street-address #postal-code

#php #codeigniter #поиск #уличный адрес #почтовый индекс

Вопрос:

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

Комментарии:

1. … и что именно вы подразумеваете под «результатами этого почтового индекса»?

2. Прошу прощения за то, что я был слишком расплывчатым, я в Великобритании, я хотел, чтобы пользователь ввел почтовый индекс SW1 2LX, например, и был возвращен с адресами в этом почтовом коде, например, 1 some road, Лондон

Ответ №1:

В Великобритании вы можете получить полный адрес из любого почтового индекса, используя 192.com .

У них есть полностью бесплатная база данных, доступная по адресу 192.com

Я не работаю на них или на кого-либо из их рекламодателей, но использовал этот сайт для многих приложений ввода данных.

Отформатируйте URL-адрес из почтового индекса, который вы ищете. т.е.

‘a1 1aa’ будет http://www.192.com/places/a/a1-1/a1-1aa

Затем в почтовом индексе будет указан весь адрес.

Вот класс, который я написал, надеюсь, он поможет:

     Imports System.Net
    Imports System.IO

    Public Class PCLookup
        Property Addresses As List(Of Address)

        Public Sub New(Postcode As String)
            GetAddresses(CreatDoc(Postcode))
        End Sub

        Private Function CreatDoc(PostCode As String) As mshtml.HTMLDocument
            Dim URL As String = FormatPostcode(PostCode)
            If URL = "" Then Return New mshtml.HTMLDocument
            Dim request As HttpWebRequest = WebRequest.Create(URL)
            Dim response As HttpWebResponse = request.GetResponse()
            Dim reader As StreamReader = New StreamReader(response.GetResponseStream())
            Dim doc As New mshtml.HTMLDocument
            Dim objDoc As mshtml.IHTMLDocument2 = doc
            Dim param As Object() = {reader.ReadToEnd()}
            objDoc.write(param)
            response.Close()
            reader.Close()
            Return objDoc
        End Function

        Private Function FormatPostcode(Postcode As String) As String
            Dim FullURL As String = "http://www.192.com/places/"
            Do Until Postcode.Contains(" ") = False
                Postcode = Replace(Postcode, " ", "")
            Loop
            If Len(Postcode) > 7 Or Len(Postcode) < 5 Then
                Return ""
            End If
            If Len(Postcode) = 5 Then
                FullURL amp;= Mid(Postcode, 1, 1) amp; "/"
                FullURL amp;= Mid(Postcode, 1, 2) amp; "-" amp; Mid(Postcode, 3, 1) amp; "/"
                FullURL amp;= Mid(Postcode, 1, 2) amp; "-" amp; Mid(Postcode, 3) amp; "/"
            End If
            If Len(Postcode) = 6 Then
                If IsNumeric(Mid(Postcode, 2, 1)) Then
                    FullURL amp;= Mid(Postcode, 1, 1) amp; "/"
                    FullURL amp;= Mid(Postcode, 1, 3) amp; "-" amp; Mid(Postcode, 4, 1) amp; "/"
                    FullURL amp;= Mid(Postcode, 1, 3) amp; "-" amp; Mid(Postcode, 4) amp; "/"
                Else
                    FullURL amp;= Mid(Postcode, 1, 2) amp; "/"
                    FullURL amp;= Mid(Postcode, 1, 3) amp; "-" amp; Mid(Postcode, 4, 1) amp; "/"
                    FullURL amp;= Mid(Postcode, 1, 3) amp; "-" amp; Mid(Postcode, 4) amp; "/"
                End If
            End If
            If Len(Postcode) = 7 Then
                FullURL amp;= Mid(Postcode, 1, 2) amp; "/"
                FullURL amp;= Mid(Postcode, 1, 4) amp; "-" amp; Mid(Postcode, 5, 1) amp; "/"
                FullURL amp;= Mid(Postcode, 1, 4) amp; "-" amp; Mid(Postcode, 5) amp; "/"
            End If
            Return FullURL
        End Function

        Private Sub GetAddresses(ObjDoc As mshtml.HTMLDocument)
            Dim Obj As mshtml.IHTMLElementCollection = ObjDoc.getElementsByTagName("td")
            Addresses = New List(Of Address)
            For Each TD As mshtml.HTMLTableCell In Obj
                If TD.className = "address" Then
                    Dim FullAddress As String = TD.innerText
                    Addresses.Add(New Address(FullAddress))
                End If
            Next        
        End Sub

    End Class

    Public Class Address
        Property Line1 As String
        Property Line2 As String
        Property Line3 As String
        Property Line4 As String
        Property Postcode As String
        Public Sub New(FullAddress As String)
            Dim Obj As Object = Split(FullAddress, ", ")
            Select Case UBound(Obj)
                Case 4
                    Line1 = Obj(0) amp; " " amp; Obj(1)
                    Line2 = ""
                    Line3 = Obj(2)
                    Line4 = Obj(3)
                    Postcode = Obj(4)
                Case 5
                    Line1 = Obj(0) amp; " " amp; Obj(1)
                    Line2 = Obj(2)
                    Line3 = Obj(3)
                    Line4 = Obj(4)
                    Postcode = Obj(5)
                Case 6
                    Line1 = Obj(0) amp; " " amp; Obj(1)
                    Line2 = Obj(2) amp; " " amp; Obj(3)
                    Line3 = Obj(4)
                    Line4 = Obj(5)
                    Postcode = Obj(6)
            End Select

        End Sub
    End Class
 

Извините, если код немного грязный, программист-самоучка!

Комментарии:

1. 192 сменили свой сайт. Добавьте это перед getrequest: С запросом. AllowAutoRedirect = True . Тайм-аут = 30000 .UserAgent = «Mozilla / 4.0 (совместимый; MSIE 5.01; Windows NT 5.0)» .Предварительная проверка подлинности = True . Учетные данные = CredentialCache. DefaultCredentials заканчиваются на

Ответ №2:

В NL вы можете однозначно идентифицировать адрес по его почтовому индексу и номеру дома.

Не во всех странах есть это свойство, поэтому ваш пробег может отличаться.

Однако вы бы сделали что-то вроде этого:

 SELECT 
  CONCAT(street,' ','$housenumber') AS streetplusnumber 
  , city
FROM postcodetostreet p
WHERE p.postcode = '$postcode' and '$housenumber' between minnumber and maxnumber
 

Таблица почтовый индекс на улицу выглядит примерно так:

 postcodetostreet
------------------
postcode varchar(6) primary key
street varchar(512)
city
minnumber
maxnumber
 

База данных обычно приобретается у третьей стороны.

Ответ №3:

Я нашел это (через http://ben-major.co.uk/2012/02/using-google-maps-to-lookup-uk-postcodes /) в то время как я сам ищу ответ на этот вопрос. Надеюсь, это поможет:

 /*fill out the postcode and hit search*/
(function($) {
$.fn.searchPc = function(options) {

    var settings = $.extend({
        address1: 'address1',
        address2: 'address2',
        address3: 'address3',
        address4: 'address4'
    }, options);

    return this.each(function() {

        var $el = $(this);
        var $form = $el.closest('form');

        //insert the button on the form
        $('<a class="postCodeLookup">Search</a>').insertAfter($el);
        $('.postCodeLookup', $form).button({icons:{primary:'ui-icon-search'}});

        $form.on('click', '.postCodeLookup', function() {

            $.post('http://maps.googleapis.com/maps/api/geocode/json?address=' $el.val() 'amp;sensor=false', function(r) {
                var lat = r['results'][0]['geometry']['location']['lat'];
                var lng = r['results'][0]['geometry']['location']['lng'];
                $.post('http://maps.googleapis.com/maps/api/geocode/json?latlng=' lat ',' lng 'amp;sensor=false', function(address) {
                    $('input[name=' settings.address1 ']').val(address['results'][0]['address_components'][0]['long_name']);
                    $('input[name=' settings.address2 ']').val(address['results'][0]['address_components'][1]['long_name']);
                    $('input[name=' settings.address3 ']').val(address['results'][0]['address_components'][2]['long_name']);
                    $('input[name=' settings.address4 ']').val(address['results'][0]['address_components'][3]['long_name']);
                });
            });

        });



    });
};
})(jQuery);


    $('input[name=postcode]').searchPc({
        address2: 'custom_field',
    });
 

http://jsfiddle.net/rxFBj/3/

Комментарии:

1. Ваше приложение находит широту / Lng почтового индекса, а затем выполняет обратный поиск по одному уличному адресу с этой широтой / Lng, поэтому оно всегда найдет только одно свойство. Не решение исходного вопроса.

Ответ №4:

Я вижу, что вы в Великобритании, что, к сожалению, означает, что вы тратите неприличную сумму денег за доступ к файлу почтовых адресов Royal Mail (PAF). Почтовый индекс.

Ответ №5:

Вы могли бы использовать веб-сервис, такой как Google geolocation api.

Комментарии:

1. Как? Я не думаю, что в geo API есть способ получить все возможные адреса, соответствующие почтовому индексу.

2. Это то, чего он хочет? Введите почтовый индекс и список, возможно, перечислите 5000 полных адресов?

3. Похоже на то. Он очень неясен. (Тем не менее, Downvote не мой, хотя, даже если бы это было правильно, это был бы очень тонкий ответ. Возможно, стоит добавить несколько ссылок)

Ответ №6:

Вы имеете в виду сервис, подобный следующему?

http://www.postcodeanywhere.co.uk/demos/address-finder.aspx

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

Хотя это платная услуга (я полагаю).

Ответ №7:

Если вы хотите добавить решение для поиска почтового индекса в свою адресную форму, вам нужно будет приобрести платную услугу для доступа к файлу почтовых индексов Royal Mail.

Ideal Postcodes предлагает подобное решение для Великобритании. Вы можете просмотреть демонстрацию здесь: https://ideal-postcodes.co.uk/postcode-lookup-demo