如果可能,我不想要調用API。我有一個用戶輸入的郵政編碼,我想根據郵政編碼的狀態顯示一段文字。我知道查找城市和州是非常複雜的,因此USPS web API可能是最好的。但是爲了匹配狀態,這應該更容易和資源更少。如何獲得給定郵政編碼的州(城市和地址不需要)?
理想的Javascript。 PHP也可以工作。
如果可能,我不想要調用API。我有一個用戶輸入的郵政編碼,我想根據郵政編碼的狀態顯示一段文字。我知道查找城市和州是非常複雜的,因此USPS web API可能是最好的。但是爲了匹配狀態,這應該更容易和資源更少。如何獲得給定郵政編碼的州(城市和地址不需要)?
理想的Javascript。 PHP也可以工作。
我只需要國家而不是城市和國家,我特別要求一種方法來做到這一點,而不會觸及api或數據庫,這會增加應用程序的權重和處理時間。我正在尋找輕量級的東西。
無論如何,因爲美國郵政編碼不是一個隨機的數據庫,而是一組穩定而連續的記錄,至少在國家方面,我已經解決了我自己的問題,並發現我認爲是輕量級和優雅的解決方案(或者一個明顯的解決方案,取決於你的觀點)。
這裏是我要如何通過JavaScript在客戶端要做到這一點:
功能的getState(ZIP){VAR = thiszip拉鍊; // parseInt(zip);
if (thiszip >= 35000 && thiszip <= 36999) {
thisst = 'AL';
thisstate = "Alabama";
}
else if (thiszip >= 99500 && thiszip <= 99999) {
thisst = 'AK';
thisstate = "Alaska";
}
else if (thiszip >= 85000 && thiszip <= 86999) {
thisst = 'AZ';
thisstate = "Arizona";
}
else if (thiszip >= 71600 && thiszip <= 72999) {
thisst = 'AR';
thisstate = "Arkansas";
}
else if (thiszip >= 90000 && thiszip <= 96699) {
thisst = 'CA';
thisstate = "California";
}
else if (thiszip >= 80000 && thiszip <= 81999) {
thisst = 'CO';
thisstate = "Colorado";
}
else if (thiszip >= 06000 && thiszip <= 06999) {
thisst = 'CT';
thisstate = "Connecticut";
}
else if (thiszip >= 19700 && thiszip <= 19999) {
thisst = 'DE';
thisstate = "Deleware";
}
else if (thiszip >= 32000 && thiszip <= 34999) {
thisst = 'FL';
thisstate = "Florida";
}
else if (thiszip >= 30000 && thiszip <= 31999) {
thisst = 'GA';
thisstate = "Georgia";
}
else if (thiszip >= 96700 && thiszip <= 96999) {
thisst = 'HA';
thisstate = "Hawaii";
}
else if (thiszip >= 83200 && thiszip <= 83999) {
thisst = 'ID';
thisstate = "Idaho";
}
else if (thiszip >= 60000 && thiszip <= 62999) {
thisst = 'IL';
thisstate = "Illinois";
}
else if (thiszip >= 46000 && thiszip <= 47999) {
thisst = 'IN';
thisstate = "Indiana";
}
else if (thiszip >= 50000 && thiszip <= 52999) {
thisst = 'IA';
thisstate = "Iowa";
}
else if (thiszip >= 66000 && thiszip <= 67999) {
thisst = 'KS';
thisstate = "Kansas";
}
else if (thiszip >= 40000 && thiszip <= 42999) {
thisst = 'KY';
thisstate = "Kentucky";
}
else if (thiszip >= 70000 && thiszip <= 71599) {
thisst = 'LA';
thisstate = "Louisiana";
}
else if (thiszip >= 03900 && thiszip <= 04999) {
thisst = 'ME';
thisstate = "Maine";
}
else if (thiszip >= 20600 && thiszip <= 21999) {
thisst = 'MD';
thisstate = "Maryland";
}
else if (thiszip >= 01000 && thiszip <= 02799) {
thisst = 'MA';
thisstate = "Massachusetts";
}
else if (thiszip >= 48000 && thiszip <= 49999) {
thisst = 'MI';
thisstate = "Michigan";
}
else if (thiszip >= 55000 && thiszip <= 56999) {
thisst = 'MN';
thisstate = "Minnesota";
}
else if (thiszip >= 38600 && thiszip <= 39999) {
thisst = 'MS';
thisstate = "Mississippi";
}
else if (thiszip >= 63000 && thiszip <= 65999) {
thisst = 'MO';
thisstate = "Missouri";
}
else if (thiszip >= 59000 && thiszip <= 59999) {
thisst = 'MT';
thisstate = "Montana";
}
else if (thiszip >= 27000 && thiszip <= 28999) {
thisst = 'NC';
thisstate = "North Carolina";
}
else if (thiszip >= 58000 && thiszip <= 58999) {
thisst = 'ND';
thisstate = "North Dakota";
}
else if (thiszip >= 68000 && thiszip <= 69999) {
thisst = 'NE';
thisstate = "Nebraska";
}
else if (thiszip >= 88900 && thiszip <= 89999) {
thisst = 'NV';
thisstate = "Nevada";
}
else if (thiszip >= 03000 && thiszip <= 03899) {
thisst = 'NH';
thisstate = "New Hampshire";
}
else if (thiszip >= 07000 && thiszip <= 08999) {
thisst = 'NJ';
thisstate = "New Jersey";
}
else if (thiszip >= 87000 && thiszip <= 88499) {
thisst = 'NM';
thisstate = "New Mexico";
}
else if (thiszip >= 10000 && thiszip <= 14999) {
thisst = 'NY';
thisstate = "New York";
}
else if (thiszip >= 43000 && thiszip <= 45999) {
thisst = 'OH';
thisstate = "Ohio";
}
else if (thiszip >= 73000 && thiszip <= 74999) {
thisst = 'OK';
thisstate = "Oklahoma";
}
else if (thiszip >= 97000 && thiszip <= 97999) {
thisst = 'OR';
thisstate = "Oregon";
}
else if (thiszip >= 15000 && thiszip <= 19699) {
thisst = 'PA';
thisstate = "Pennsylvania";
}
else if (thiszip >= 00300 && thiszip <= 00999) {
thisst = 'PR';
thisstate = "Puerto Rico";
}
else if (thiszip >= 02800 && thiszip <= 02999) {
thisst = 'RI';
thisstate = "Rhode Island";
}
else if (thiszip >= 29000 && thiszip <= 29999) {
thisst = 'SC';
thisstate = "South Carolina";
}
else if (thiszip >= 57000 && thiszip <= 57999) {
thisst = 'SD';
thisstate = "South Dakota";
}
else if (thiszip >= 37000 && thiszip <= 38599) {
thisst = 'TN';
thisstate = "Tennessee";
}
else if ((thiszip >= 75000 && thiszip <= 79999) || (thiszip >= 88500 && thiszip <= 88599)) {
thisst = 'TX';
thisstate = "Texas";
}
else if (thiszip >= 84000 && thiszip <= 84999) {
thisst = 'UT';
thisstate = "Utah";
}
else if (thiszip >= 05000 && thiszip <= 05999) {
thisst = 'VT';
thisstate = "Vermont";
}
else if (thiszip >= 22000 && thiszip <= 24699) {
thisst = 'VA';
thisstate = "Virgina";
}
else if (thiszip >= 20000 && thiszip <= 20599) {
thisst = 'DC';
thisstate = "Washington DC";
}
else if (thiszip >= 98000 && thiszip <= 99499) {
thisst = 'WA';
thisstate = "Washington";
}
else if (thiszip >= 24700 && thiszip <= 26999) {
thisst = 'WV';
thisstate = "West Virginia";
}
else if (thiszip >= 53000 && thiszip <= 54999) {
thisst = 'WI';
thisstate = "Wisconsin";
}
else if (thiszip >= 82000 && thiszip <= 83199) {
thisst = 'WY';
thisstate = "Wyoming";
}
else {
thisst = 'none';
}
return thisst;
}
這將是很容易重新設計在PHP或您最喜愛的語言杜日。
大部分代碼來自this useful page。
一些範圍重疊,你需要額外的範圍,以保持德克薩斯州和路易斯安那州的俄克拉荷馬州等。 – kennebec 2015-03-03 02:52:48
我看不到TX,LA或OK在哪裏重疊。你能澄清嗎? – 2015-03-10 17:31:52
已注意。 TX,LA和OK的範圍是固定的。 – 2015-03-31 20:26:30
您可以使用範圍數組返回給定郵政編碼的最可能狀態。
這不是一個驗證器 - 並不是每個範圍內的數字都被實際指定爲一個郵政編碼,並且將來可能會添加新的範圍。
function stateFromZip(z){
z= parseInt(z, 10);// removes leading '0'
if(z<1001 || z>99950) return null;
var i= 69, next, s,
zs= [
[1001, 2791, 'Massachusetts'], [2801, 2940, 'Rhode Island'], [3031, 3897, 'New Hampshire'],
[3901, 4992, 'Maine'], [5001, 5495, 'Vermont'], [5501, 5544, 'Massachusetts'],
[5601, 5907, 'Vermont'], [6001, 6389, 'Connecticut'], [6390, 6390, 'New York'],
[6401, 6928, 'Connecticut'], [7001, 8989, 'New Jersey'], [10001, 14975, 'New York'],
[15001, 19640, 'Pennsylvania'], [19701, 19980, 'Delaware'], [20001, 20039, 'Dist. of Columbia'],
[20040, 20167, 'Virginia'], [20042, 20599, 'Dist. of Columbia'], [20331, 20331, 'Maryland'],
[20335, 20797, 'Maryland'], [20799, 20799, 'Dist. of Columbia'], [20812, 21930, 'Maryland'],
[22001, 24658, 'Virginia'], [24701, 26886, 'West Virginia'], [27006, 28909, 'North Carolina'],
[29001, 29948, 'South Carolina'], [30001, 31999, 'Georgia'], [32004, 34997, 'Florida'],
[35004, 36925, 'Alabama'], [37010, 38589, 'Tennessee'], [38601, 39776, 'Mississippi'],
[39901, 39901, 'Georgia'], [40003, 42788, 'Kentucky'], [43001, 45999, 'Ohio'],
[46001, 47997, 'Indiana'], [48001, 49971, 'Michigan'], [50001, 52809, 'Iowa'],
[53001, 54990, 'Wisconsin'], [55001, 56763, 'Minnesota'], [57001, 57799, 'South Dakota'],
[58001, 58856, 'North Dakota'], [59001, 59937, 'Montana'], [60001, 62999, 'Illinois'],
[63001, 65899, 'Missouri'], [66002, 67954, 'Kansas'], [68001, 68118, 'Nebraska'],
[68119, 68120, 'Iowa'], [68122, 69367, 'Nebraska'], [70001, 71232, 'Louisiana'],
[71233, 71233, 'Mississippi'], [71234, 71497, 'Louisiana'], [73001, 73199, 'Oklahoma'],
[73301, 73301, 'Texas'], [73401, 74966, 'Oklahoma'], [75001, 75501, 'Texas'],
[75502, 75502, 'Arkansas'], [75503, 79999, 'Texas'], [80001, 81658, 'Colorado'],
[82001, 83128, 'Wyoming'], [83201, 83876, 'Idaho'], [84001, 84784, 'Utah'],
[85001, 86556, 'Arizona'], [87001, 88441, 'New Mexico'], [88510, 88589, 'Texas'],
[88901, 89883, 'Nevada'], [90001, 96162, 'California'], [96701, 96898, 'Hawaii'],
[97001, 97920, 'Oregon'], [98001, 99403, 'Washington'], [99501, 99950, 'Alaska']
];
while(i){
next= zs[--i];
if(z>next[0] && z<next[1]) return next[2];
}
return null;
}
stateFromZip( '49125')
/*返回的值:(字符串) 密歇根 */
這就是我所提出的確切問題的一個很好的解決方案。 – 2015-03-03 18:35:21
zippopotam.us具有REST API。 下面是如何從純JavaScript一個ZIP獲得一個狀態(無庫)爲例:
var getStatebutton = document.getElementById('GetStateButton');
getStatebutton.onclick = function() {
var zipCode = document.getElementById('ZIPCode');
var zip = zipCode.value;
if (!zip) return;
var url = 'http://api.zippopotam.us/us/' + zip;
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
var result = xhr.responseText;
var zippo = JSON.parse(result);
var resultDiv = document.getElementById('divResult');
resultDiv.innerHTML = zippo.places[0].state;
}
};
xhr.open('GET', url, true);
xhr.send(null);
};
ZIP:
<input type='text' id='ZIPCode' value='90210' />
<button id="GetStateButton">Get State</button>
<p></p>State:
<div id='divResult'></div>
或jsfiddle如果你喜歡。
好的答案,但我不希望有任何外部依賴項添加到應用程序。這是精益,但仍然取決於zippopotam.us。 – 2015-03-03 18:36:15
這些免費的之一有國家信息 - http://www.unitedstateszipcodes.org/zip-code-database/ – 2015-03-03 00:15:30
你需要一個zipcode的數據庫及其各自的國家。你可以從USPS獲得一個。 – castis 2015-03-03 00:15:33
此問題的副本只有一個upvoted答案,並且它是指向已刪除問題的鏈接。 – dave 2015-03-03 00:20:09