Google Civics API'sı en iyi çözümdür. Tek bir API isabeti size hem Seçilmiş Yetkilileri hem de Bölgeleri sunar.
Aşağıdaki gibi GPS koordinatları (lat / lng) ile İlçeler alabilirsiniz:
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'i kullanarak eyalet düzeyindeki bilgilere benzer olabilirsiniz :
"http://openstates.org/api/v1/legislators/geo/?apikey={0}&lat={1}&long={2}";
Google Civics API'sı Hakkında Sıkça Sorulan Sorular
Google Civics API'sı, lat / lng'yi destekleyip desteklemediğine dair belirsizdir ve birkaç ayda bir, biri bildirene ve Google bir çalışanı veya daha spesifik olarak bir çalışanı bildirene kadar lat / lng'yi bir ay kadar desteklemeyi bırakacaktır. muhtemelen gönüllü zaman bildirimlerinde ("Chelan") bunun üzerinde çalışıyor ve düzeltmeye çalışıyor:
https://groups.google.com/d/msg/google-civicinfo-api/0td48h7JxYA/Zhij3yQiCgAJ
Hizmetiniz Civics API verilerinin çökmesini beklerse ve Civics API verilerinin yararlı olmasını gerektiriyorsa çökmeyebilir, ancak aylarca işe yaramaz. En son başarısızlık 2018'deki çoğu eyalet için tüm oylama dönemiydi, bu yüzden bu kesinti süresidir.
Coğrafi kodlamayı açıkça ters çevirerek savunma oynayabilirsiniz:
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);
Burada, her zamanki HTML5'ten kullanıcının konumunu soruyoruz ve Hayır / Engelle dediklerinde onlara "Konumunuz alınamadı" mesajını gösteriyoruz (geoFail ile). Daha sonra lat / lng sahibiz, ancak Google Civics API'sı düzensizdir, bu yüzden Google'dan açıkça adresi isteyeceğiz. Bu, r [0] .formatted_address olarak geri döner; bazı yanıtlarda Google, aradıkları konumu onaylamak için kullanıcıya göstermenizi önerir. Bu yüzden bunu adres metin kutusuna koyduk ve üzerinden gönderdik loadReps(lat, lng, address)
.
Coğrafi kod çağrısının başarısız olabileceğini unutmayın (kesintili bir internet bağlantısı da dahil olmak üzere), ancak bazen Google Civics API tamamen çalışır durumdadır, bu nedenle kullanıcıyı bu senaryoda henüz bir sonucu reddetmeye gerek yoktur; Bu durumda yazdığım arka uç, lat / lng ve isteğe bağlı adresi kabul edebilir ve eksik adresi tolere edebilir. Sonra Google Civics API ile konuşmaya çalışır ve hiçbir şey almazsa, hayatta kalması ve kullanıcıya Civics API'sının bozuk olduğunu söylemek gerekir, üzgünüm.
Tarihsel Cevap
Sunlight Foundation * 'ın Kongre API'sı yalnızca Federal'dir - sizin için önemliyse eyalet düzeyinde yoktur. Ve [Sunlight Foundation kapanıyor, çünkü GovTrack'ın çabalarını çoğaltmak istemiyorlar.
GovTrack API'sı * daha eksiksizdir. Bunlar /role
sorunuza en yakın olanıdır:
https://www.govtrack.us/developers/api#endpoint_role
Size mevcut tüm Senatörleri ve Meclis üyelerini ve bir sonraki seçimlerinin ne zaman yapılacağını söyler. Böylece bir filtreleme yükünüz olur.
İstediğiniz eyalet düzeyinde şeyler için OpenStates.org gibi:
http://openstates.org/api/v1/legislators/geo/?apikey= {0} & lat = {1} & long = {2}
https://openstates.org/
* Kötü haber, her şey her zaman kapanıyor. Sunlight Foundation, Govtrack'un çalışmalarını kopyalamaktan kaçınmak için API'larını kapattı. Govtrack, ProPublica'nın çalışmalarını tekrarlamaktan kaçınmak için şimdi onlarınkini kapatıyor . Ancak Propublica'nın size bölgeyi hiç bir yerden vermediği görülüyor:
https://projects.propublica.org/api-docs/congress-api/
Öyleyse şunu bekleyebilirsiniz, bu mantıklı değil, çünkü NYTimes'ın kapanış Temsilcisi projesinden aktarılan ProPublica'nın Temsilci sitesi , bir adresi haritalamanıza ve bölgeyi GPS kablolarından almanıza izin veriyor. Ve bu sayfadan API'larına bağlanıyorlar. Sizi kandırdım, çünkü bu sayfa API'larını kullanmıyor. Aslında, Sunlight Foundation'ın bölge bulma API'sını kullanıyor.
Ne dağınıklık.