Google Civics API to najlepsze rozwiązanie. Jedno trafienie API zapewnia zarówno wybranych urzędników, jak i dystrykty.
Dzielnice można uzyskać według współrzędnych GPS (lat / lng) w następujący sposób:
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
Możesz uzyskać podobne informacje o poziomie stanu za pomocą OpenStates :
"http://openstates.org/api/v1/legislators/geo/?apikey={0}&lat={1}&long={2}";
Dodatki na temat interfejsu API Google Civics często się psują
Interfejs API Google Civics jest niejasny w kwestii tego, czy obsługuje lat / lng, a co kilka miesięcy, po prostu przestanie obsługiwać lat / lng przez około miesiąc, dopóki ktoś go nie zgłosi i Google nie zauważy, a dokładniej, jednego pracownika prawdopodobnie pracują nad tym w swoich informacjach o czasie wolontariatu („Chelan”) i zastanawiają się, jak to naprawić:
https://groups.google.com/d/msg/google-civicinfo-api/0td48h7JxYA/Zhij3yQiCgAJ
Jeśli Twoja usługa spodziewa się, że dane interfejsu API Civics ulegną awarii, a jeśli wymaga danych Civics API, może się nie zawiesić, ale będzie bezużyteczna przez wiele miesięcy. Ostatnią porażką był cały okres głosowania w większości stanów w 2018 r., Więc to dość przestój.
Możesz grać w obronę, wyraźnie odwracając geokodowanie:
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);
Więc tutaj przechodzimy przez zwykłe pytanie HTML5 o lokalizację użytkownika, a jeśli powiedzą Nie / Blokuj, pokażemy im komunikat „Nie można uzyskać Twojej lokalizacji” (z geoFail). Mamy już łacinę / język, ale interfejs API Google Civics jest zmienny, więc poprosimy Google o podanie adresu. To wraca jako r [0] .formatowany_adres, który w niektórych odpowiedziach Google zaleca pokazanie użytkownikowi, aby potwierdzić lokalizację, w której szuka. Więc umieszczamy to w polu tekstowym adresu i wysyłamy za pośrednictwem loadReps(lat, lng, address)
.
Pamiętaj, że możliwe jest, że wywołanie geokodu może się nie powieść (w tym z powodu niestabilnego połączenia internetowego), ale czasami interfejs API Google Civics jest w pełni operacyjny, więc nie musisz odmawiać użytkownikowi wyniku w tym scenariuszu; backend, który napisałem w tym przypadku, może zaakceptować adres łaciński i opcjonalny oraz tolerować brakujący adres. Następnie próbuje porozmawiać z Google Civics API, a jeśli nic nie dostanie, musi to przeżyć i powiedzieć użytkownikowi, że interfejs API Civics jest zepsuty, przepraszam.
Odpowiedź historyczna
Kongresowy interfejs API od Sunlight Foundation * jest dostępny tylko na poziomie federalnym - bez poziomu państwowego, jeśli ma to dla Ciebie znaczenie. I [Sunlight Foundation zamyka się, ponieważ nie chcą powielać wysiłków GovTrack.
Interfejs API GovTrack * jest bardziej kompletny. Ich /role
jest najbliżej twojego pytania:
https://www.govtrack.us/developers/api#endpoint_role
Mówi wszystkim obecnym senatorom i członkom Izby oraz o ich następnych wyborach. Więc miałbyś obciążenie filtrujące.
Do rzeczy na poziomie stanu chcesz OpenStates.org, takich jak:
http://openstates.org/api/v1/legislators/geo/?apikey= {0} & lat = {1} i long = {2}
https://openstates.org/
* Złe wieści, wszystko zamyka się cały czas. Fundacja Sunlight zamknęła API, aby uniknąć powielania pracy Govtrack. Govtrack zamyka teraz ich , aby uniknąć powielania pracy ProPublica. Ale Propublica's wcale nie daje ci dystansu z lokalizacji:
https://projects.propublica.org/api-docs/congress-api/
Poczekaj więc, możesz powiedzieć, że to nie ma sensu, ponieważ witryna Repozytorium ProPublica , która jest przeniesiona z projektu Reprezentacja zamknięcia NYTimes, pozwala zmapować adres i uzyskać dzielnicę od współrzędnych GPS. I link do ich interfejsu API z tej strony. Dobrze cię oszukałem, bo ta strona nie używa swojego API. W rzeczywistości korzysta z interfejsu API do wyszukiwania dzielnic Sunlight Foundation.
Co za bałagan.