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在是否支持lat / lng方面含糊其词,每隔几个月左右,它将停止支持lat / lng一个月左右,直到有人举报并通知Google,或更具体地讲,一名员工可能在他们的志愿者时间通知(“ Chelan”)中对此进行了研究,并希望解决该问题:
https://groups.google.com/d/msg/google-civicinfo-api/0td48h7JxYA/Zhij3yQiCgAJ
如果您的服务期望使用Civics API数据,那么它将崩溃,并且如果它需要Civics API数据才有用,则可能不会崩溃,但是一次只能用几个月。最近的失败是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)。然后我们得到了经度/纬度,但是Google Civics API不稳定,因此我们将向Google明确询问地址。返回为r [0] .formatted_address,在Google的某些答案中,Google建议您显示给用户以确认他们要查找的位置。因此,我们将其放在地址文本框中,然后通过发送loadReps(lat, lng, address)
。
请注意,地理编码调用可能会失败(包括由于互联网连接中断),但是有时Google Civics API可以完全正常运行,因此,在这种情况下,无需拒绝用户执行任何操作;我在这种情况下编写的后端可以接受lat / lng和可选地址,并且可以容忍丢失的地址。然后,它尝试与Google Civics API进行通信,如果什么也没收到,它需要继续生存下去,并告诉用户Civics API已损坏,对不起。
历史答案
Sunlight Foundation *提供的Congress API仅适用于联邦政府-如果您认为很重要,则无需州一级。[Sunlight Foundation正在关闭,因为他们不想重复GovTrack的工作。
GovTrack的API *更完整。他们/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的工作。为了避免重复ProPublica的工作,Govtrack现在将关闭其工作。但是Propublica似乎根本无法给您提供地区信息:
https://projects.propublica.org/api-docs/congress-api/
所以请等一下,这没有任何意义,因为ProPublica的Represent站点是从NYTimes的关机Represent项目转移而来的,它确实可以让您映射地址并从GPS坐标中获取地区。他们从该页面链接到其API。骗了您,因为该页面未使用其API。实际上,它使用了Sunlight Foundation的地区查找API。
真是一团糟。