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.
Який безлад.