Google Civics APIは最適なソリューションです。1回の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をサポートしているかどうかについて曖昧であり、数か月ごとに、誰かが報告してGoogleが通知するか、より具体的には1人の従業員に通知するまで、lat / lngのサポートを1か月程度停止しますおそらくボランティアの時間通知( "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を使用)。lat / lngを取得しましたが、Google Civics APIは不安定なので、Googleに明示的に住所を尋ねます。これはr [0] .formatted_addressとして返されます。いくつかの回答では、検索中の場所を確認するためにユーザーに表示することを推奨しています。それをアドレステキストボックスに入れて、経由で送信します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は、 Govtrackの作業の重複を避けるためにAPIをシャットダウンしました。Govtrackは、ProPublicaの作業の重複を避けるために、現在それらをシャットダウンしています。しかし、Propublica'sは、場所から地区をまったく提供していないようです。
https://projects.propublica.org/api-docs/congress-api/
NYTimesのシャットダウンRepresentプロジェクトから転送されたProPublicaのRepresentサイトでは、住所をマッピングし、GPS座標から地区を取得できるため、意味がありません。そして、そのページからAPIにリンクします。そのページはAPIを使用していないためです。実際、Sunlight Foundationの地区検索APIを使用しています。
なんてこった