Czy istnieje interfejs API do określania dzielnic kongresowych? [Zamknięte]

11

Chcę ustalić dystrykt kongresowy na podstawie adresu podanego przez mojego użytkownika. Pozwoli to uniknąć konieczności samodzielnego sprawdzenia przez użytkownika.

Czy istnieje tego rodzaju interfejs API?

Uwaga

Próbując go znaleźć, natknąłem się tylko na:

  • http://www.govtrack.us/developers/api
    (nie wiem jednak, jak przesłać adres lub kod pocztowy)

    W interfejsie API dostępne są następujące zasoby

    ... Ustawy i rezolucje w Kongresie USA od 1973 r. (93. Kongres).

    ... Para (rachunek, osoba) wskazująca na cosponsorstwo, z datami przyłączenia i wycofania.

    ... Członkowie Kongresu i Prezydenci USA od założenia narodu.

    ... Warunki sprawowane przez członków Kongresu i prezydentów USA. Każda kadencja odpowiada wyborom, co oznacza, że ​​każda kadencja w Izbie obejmuje dwa lata (jeden „Kongres”), jako prezydent cztery lata, a w Senacie sześć lat (trzy „kongresy”).

    ... Głosuj na apelach w Kongresie USA od 1789 roku. Dostęp do głosowania odbywa się za pośrednictwem interfejsu API Vote_voter.

    ... Jak ludzie głosowali w głosowaniu imiennym w Kongresie USA od 1789 roku. Zobacz API głosowania. Filtruj w polu głosowania, aby uzyskać wyniki konkretnego głosowania ...

  • http://www.opencongress.org/api
    (wygląda na to, że można znaleźć informacje o kongresie, ale nie dzielnice)

    Ten interfejs API zapewnia programistom uporządkowany dostęp do wszystkich danych na OpenCongress, od oficjalnych informacji o rachunkach, wiadomości i pokrycia blogów po generowane przez użytkowników głosy na rachunki i wiele więcej ...

    Ten interfejs API domyślnie zwraca XML. Wszystkie zapytania mogą również zwracać JSON ...

  • https://groups.google.com/forum/?fromgroups=#!topic/opendems-discuss/CeKyi_aANaE
    (podobne pytanie, brak rozwiązania)

    Patrzyłem na Open Dems i widziałem, co w tym momencie zostało odkryte, a co nie. Współpracuję z Demokratami za granicą i jestem zainteresowany wykorzystaniem materiałów z laboratorium na swoich stronach.

    Szybko przejrzałem interfejs API Precinct, który robi zarówno więcej, jak i mniej niż to, czego potrzebuję. Idealnym zasobem byłby przynajmniej sposób na tłumaczenie adresów na CD (uzyskanie danych z dystryktu stanu również byłoby dobre), ponieważ ułatwiłoby to członkostwu DA zmianę wyścigów, takich jak wyścig NY26 w zeszłym miesiącu. .

Aktualizacja

Patrzę na źródło strony internetowej govtrack.us i funkcja „doGeoCode” może być przydatna.

view-source: http: //www.govtrack.us/congress/members

Jeśli nikt nie ma żadnych sugestii, postaram się odejść od tego, co robią.

Ardis
źródło
1
Zaktualizowałem swoje pytanie o niektóre miejsca, które oglądałem.
ardavis,
Sensowne może być przeniesienie go do StackOverflow lub ponowne przypisanie go tam i połączenie tutaj, ponieważ jest to ważne, ważne i przydatne pytanie.
Chris Moschini,

Odpowiedzi:

7

Nie korzystałem z niego, ale szybkie wyszukiwanie przywiodło mnie do Congress API od Sunlight Labs. Sprawdź ich metodę districts.getDistrictsFromZip - wydaje się, że właśnie tego szukasz. Możesz uzyskać lepsze (dokładniejsze) wyniki geokodując adres samodzielnie, a następnie używając districts.getDistrictFromLatLong - Zakładam, że dany kod pocztowy może przekraczać granice dzielnicy.

Caleb
źródło
1
Dziękuję @Caleb. Nie natrafiłem na to, kiedy szukałem, wydaje mi się, że dokładnie tego szukam. Doceniam to.
ardavis,
Aktualizacja: strona klucza Sunlight API już nie działa.
Seth Connell,
4

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 /rolejest 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.

Chris Moschini
źródło
2
Przedstawiciel ProPublica zasugerował, że korzystam z Google Civic Information API ( developers.google.com/civic-information/docs/v2/representatives/... )
kmoser
1
@kmoser Dzięki - dostałem tę samą odpowiedź. Zaktualizowana odpowiedź.
Chris Moschini
2

Zdaję sobie sprawę, że to pytanie jest stare, ale pomyślałem, że wrzucę moje dwa centy za każdego, kto może wciąż patrzeć.

Po pierwsze, kilka podstawowych informacji. Dzielnice kongresowe są niezwykle specyficzne - aż do samego adresu, nie tylko ulicy. Ja i mój sąsiad po drugiej stronie ulicy mogą znajdować się w różnych dzielnicach kongresowych. Dlatego tak ważne jest, aby uzyskać dobry kod ZIP + 4, aby upewnić się, że umieścisz adres we właściwej dzielnicy. System (taki jak SmartyStreets lub Melissa Data lub QAS itp.), Który sprawdza poprawność adresu, dałby ci wiarygodne ZIP + 4, aby upewnić się, że dzielnica jest poprawna.

SmartyStreets ma interfejs API LiveAddress , który zwraca dane kongresowe wraz z ponad 40 innymi punktami danych (geokody, dane mieszkaniowe vs. komercyjne itp.).

Michelle
źródło
Biorąc pod uwagę IL-04, nie jestem nawet pewien, czy ZIP + 4 uzyska odpowiednią dzielnicę. (geojson w skrócie na gist.github.com/anonymous/f2e46f17275f6dbb68db skopiowany z github.com/benbalter/congressional-districts/blob/gh-pages/IL/…, ponieważ obecnie nie jest renderowany).
... mówi jednak, że zip + 4 powinien doprowadzić cię do budynku i zawiera informacje, takie jak po której stronie ulicy jesteś. Może więc, ale weź pod uwagę, że zestaw zip + 4, który mapuje dzielnicę, byłby liczbą budynków w tej dzielnicy, które mogłyby stać się niewygodne.
0

Melissa Data tworzy narzędzia do weryfikacji adresu, które obejmują informacje o dzielnicach politycznych. Nie wiem, czy mają publiczny interfejs API; powyższy link prowadzi do strony wyszukiwania adresu. Oferują ograniczoną liczbę bezpłatnych wyszukiwań, które można zwiększyć dzięki subskrypcji . Przed umieszczeniem tego w aplikacji produkcyjnej sprawdź warunki użytkowania.

Chociaż ich dane są aktualizowane co miesiąc, zauważyłem, że niektóre z nich nie odzwierciedlają niedawnej redystrybucji.

Wiele stanów ma te informacje dostępne, ale wątpię, by w ich wdrażaniu była jakaś spójność.

TGnat
źródło