Google Civics API - лучшее решение. Один хит API дает вам выборных должностных лиц и округов.
Вы можете получить Районы по координатам GPS (широта / долгота) следующим образом:
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}";
Дополнения о Google Civics API часто выходят из строя
Google Civics API неопределенно говорит о том, поддерживает ли он широту и долготу, и каждые несколько месяцев или около того он просто прекращает поддерживать широту и долготу в течение месяца или около того, пока кто-то не сообщит об этом, и 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 полностью функционирует, поэтому нет необходимости отказывать пользователю в этом сценарии; бэкэнд, который я написал в этом случае, может принимать широту / долготу и необязательный адрес и допускать отсутствие адреса. Затем он пытается связаться с Google Civics API, и, если он ничего не получает, ему нужно пережить это и сообщить пользователю, что Civics API сломан, извините.
Исторический ответ
API Конгресса от 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.
Какой беспорядок