API Google Civics - найкраще рішення. Одне звернення API отримує як Вибраних чиновників, так і округів.
Отримати райони можна за допомогою GPS-координат (лат. / Lng) так:
public async Task<GoogleCivicsResult> FetchAndParseUSDistrictAsync(
decimal lat, decimal lng, string address = null)
{
string googleApiKey = App.GoogleApiKey;
string reqAddr = Uri.EscapeDataString(address ?? lat + "," + lng);
string url = "https://www.googleapis.com/civicinfo/v2/representatives?alt=json&key={0}&address={1}";
url = String.Format(url, googleApiKey, reqAddr);
var req = new HttpWebRequestAsync(url);
var data = await req.GetStringAsync();
var result = JsonConvert.DeserializeObject<GoogleCivicsResult>(data);
return result;
}
public class GoogleCivicsResult
{
public Address normalizedInput { get; set; }
public Dictionary<string, Division> divisions { get; set; }
public Office[] offices { get; set; }
public Official[] officials { get; set; }
}
public class Address
{
public string line1 { get; set; }
public string line2 { get; set; }
public string city { get; set; }
public string state { get; set; }
public string zip { get; set; }
}
public class Division
{
public string name { get; set; }
public int[] officeIndices { get; set; }
public Office[] offices { get; set; }
}
public class Office
{
// President of the United States
// United States Senate
// United States House of Representatives FL-06
// Governor
// Lieutenant Governor
// Attorney General
// Sheriff
// County Judge
// Council Chair
public string name { get; set; }
// ocd-division/country:us/state:fl/cd:6
// ocd-division/country:us/state:fl
// ocd-division/country:us/state:fl/county:volusia
public string divisionId { get; set; }
// administrativeArea1
public string[] levels { get; set; }
// legislatorUpperBody
// legislatorLowerBody
// headOfGovernment
// deputyHeadOfGovernment
public string[] roles { get; set; }
public int[] officialIndices { get; set; }
}
public class Official
{
public string name { get; set; }
public Address[] address { get; set; }
public string party { get; set; }
public string[] phones { get; set; }
public string[] urls { get; set; }
public string photoUrl { get; set; }
public Social[] channels { get; set; }
public string[] emails { get; set; }
}
public class Social
{
public string type { get; set; }
public string id { get; set; }
}
https://developers.google.com/civic-information/docs/v2/representatives/representativeInfoByAddress
Ви можете отримати подібну інформацію на рівні державного рівня за допомогою OpenStates :
"http://openstates.org/api/v1/legislators/geo/?apikey={0}&lat={1}&long={2}";
Додатки про API Google Civics, що часто знижується
API Google Civics неясний щодо того, підтримує він lat / lng, і кожні кілька місяців він перестане підтримувати lat / lng протягом місяця або близько того, поки хтось не повідомить про це і не помітить Google, а точніше - одного працівника там, ймовірно, працює над цим у своїх повідомленнях про волонтерський час ("Челан") і розглядає питання, як це виправити:
https://groups.google.com/d/msg/google-civicinfo-api/0td48h7JxYA/Zhij3yQiCgAJ
Якщо ваша служба очікує, що дані API Civics будуть виходити з ладу, і якщо для цього потрібні дані API Civics, вони можуть не працювати, але вони будуть марними місяцями одночасно. Останньою невдачею був весь період голосування для більшості штатів у 2018 році, тож це досить простой час.
Ви можете грати в захист шляхом явного зворотного геокодування:
if (!(navigator && navigator.geolocation))
return geoFail();
navigator.geolocation.getCurrentPosition(function (position) {
var coords = position.coords;
var lat = coords.latitude;
var lng = coords.longitude;
if (!lat || !lng)
return geoFail();
var geocoder = new google.maps.Geocoder;
geocoder.geocode({ 'location': { lat: lat, lng: lng } },
function (r, status) {
if (status !== 'OK' || !r || !r.length) {
loadReps(lat, lng);
return;
}
var address = r[0].formatted_address;
$('#address').val(address);
loadReps(lat, lng, address);
});
}, geoFail);
Отже, ми переходимо через звичайний HTML5 запитуємо про місцезнаходження користувача, і якщо вони кажуть "Не / Блокувати", ми показуємо їм повідомлення "Не вдалося отримати ваше місцезнаходження" (з geoFail). Тоді у нас є lat / lng, але, API Google Civics є нестабільним, тому явно попросимо Google прямо вказати адресу. Це повертається як r [0] .formatted_address, який у деяких відповідях Google рекомендує показати користувачеві, щоб підтвердити місцезнаходження, яке він шукає. Тому ми поміщаємо це в текстове поле адреси та надсилаємо його через loadReps(lat, lng, address).
Зауважте, що можливо, виклик геокоду може не вдатися (в тому числі через невдале підключення до Інтернету), але іноді API Google Civics працює повністю, тому не потрібно заперечувати користувачеві результат у цьому сценарії; Вхідний текст, який я написав у цьому випадку, може приймати lat / lng та необов'язкову адресу та терпіти адресу, яка відсутня. Потім він намагається поговорити з API Google Civics, і, якщо нічого не отримує, йому потрібно це пережити і повідомити користувачеві, що API Civics зламаний, вибачте.
Історична відповідь
API конгресу від фонду Sunlight Foundation * є лише федеральним - не на державному рівні, якщо це важливо для вас. І [Sunlight Foundation вимикається, тому що вони не хочуть дублювати зусилля GovTrack.
API GovTrack * є більш повним. Їх /roleнайближче до вашого питання:
https://www.govtrack.us/developers/api#endpoint_role
Він повідомляє вам усіх нинішніх членів сенаторів та палат та про їх наступні вибори. Таким чином, у вас буде навантаження на фільтрування.
Для матеріалів на державному рівні вам потрібно OpenStates.org, наприклад:
http://openstates.org/api/v1/legislators/geo/?apikey= {0} & lat = {1} & long = {2}
https://openstates.org/
* Погані новини, все вимикається весь час. Sunlight Foundation відключив їх API, щоб уникнути дублювання роботи Govtrack. Govtrack вимикає їх зараз , щоб уникнути дублювання роботи ProPublica. Але, схоже, Propublica взагалі не дає вам району:
https://projects.propublica.org/api-docs/congress-api/
Тож зачекайте, що ви можете сказати, це не має сенсу, оскільки сайт Представлення ProPublica , який переноситься з проекту закриття Представляти NYTimes, дозволяє вам відобразити адресу та отримати округ від GPS-координат. І вони посилаються на свій API з цієї сторінки. Добре обдурили вас, адже ця сторінка не використовує їх API. Насправді він використовує районний API пошуку Sunlight Foundation.
Який безлад.