.. a następnie mapy Google „oddzielają wody od wód”
Cóż, nie w sensie biblijnym, ale ...
Chciałbym wiedzieć, jakie mam opcje, aby sprawdzić, czy punkt [Lat, Lon] to Ląd czy Woda.
Mapy Google oczywiście mają te dane (zbiorniki wodne są niebieskie) - ale czy jest coś w API, czego mogę użyć do tego? A jeśli nie - czy nie służą temu, ponieważ nigdy o tym nie pomyśleli? Albo dlatego, że jest to zbyt skomplikowane?
Nie znalazłem żadnych informacji w tej sprawie - poza kilkoma podobnymi pytaniami (np. Znalezienie typu terenu, czy wzniesienia - ale nie jest to dokładnie to, czego potrzebuję).
Czy jest do tego oddzielna warstwa? Opcja? Komenda? Czy powinienem zrobić to ręcznie?
Jedynym sposobem, w jaki mogę wymyślić, jak podejść do tego (powinienem zrobić to ręcznie), jest sprawdzenie każdego serwowanego kafelka pod kątem dokładnego punktu - a następnie sprawdzenie wartości RGB dla tego odcienia mapy Google. To tylko teoria - bo w praktyce - nie mam pojęcia, jak to osiągnąć, pierwszą przeszkodą jest to, że nie wiem, jak mogę na przykład przekonwertować położenie piksela na kafelku na punkt [LatLon]
Gotowe rozwiązanie byłoby znacznie łatwiejsze.
Zwróć uwagę, że nie potrzebuję CAŁEJ wody na świecie (na przykład - nie obchodzą mnie strumienie, oczka wodne, większość rzek czy basen twojego sąsiada. Potrzebuję punktów, gdzie można zapuścić się bez pomocy pływającego pojazdu )
EDYTUJ I
Po przeczytaniu komentarzy: Metoda elewacji nie jest wiarygodna, jest zbyt wiele miejsc PONIŻEJ poziomu morza (listę „najgłębszych” 10 można zobaczyć tutaj http://geology.com/below-sea-level/ ) i tam jest zbyt wiele śródlądowych zbiorników wodnych POWYŻEJ poziomu morza (jezior). Metoda odwrotnej geolokalizacji nie jest niezawodna, ponieważ zwróci podmiot geopolityczny, taki jak miasto lub stan - lub wielokrotnie ZERO. Sprawdziłem już te pseudo-rozwiązania, zanim zadałem pytanie - ale żadne z nich tak naprawdę nie odpowiedział na pytanie - te metody są w najlepszym razie złym „zgadywaniem”.
źródło
Odpowiedzi:
Oto 2 różne sposoby, możesz spróbować:
Możesz użyć odwrotnego geokodowania Map Google . W zestawie wyników możesz określić, czy jest to woda, sprawdzając
types
. Na wodach jest to typnatural_feature
. Zobacz więcej pod tym linkiem http://code.google.com/apis/maps/documentation/geocoding/#Types .Musisz również sprawdzić nazwy obiektów, jeśli zawierają,
Sea, Lake, Ocean
i kilka innych słów związanych z wodami, aby uzyskać większą dokładność. Na przykład pustynie też sąnatural_feature
s.Plusy - Cały proces wykrywania zostanie wykonany na komputerze klienta. Nie ma potrzeby tworzenia własnej usługi po stronie serwera.
Wady - bardzo niedokładne, a szanse na uzyskanie „żadnego” na wodach są bardzo wysokie.
Możesz wykryć wody / lądy według pikseli, używając Google Static Maps . Ale w tym celu musisz stworzyć usługę http.
Oto kroki, które musi wykonać Twoja usługa:
latitude
,longitude
icurrent zoom
od klienta.http://maps.googleapis.com/maps/api/staticmap?center={
szerokość geograficzną,
długość}&zoom={
aktualne powiększenie } & size = 1x1 & maptype = roadmap & sensor = false request do usługi Google Static Map.Nie możesz wykryć koloru piksela po stronie klienta. Tak, możesz załadować statyczny obraz na komputer klienta i narysować obraz na
canvas
elemencie. Ale nie możesz użyćgetImageData
kontekstu płótna do uzyskania koloru piksela. Jest to ograniczone przez zasady dotyczące wielu domen.Więzy - bardzo dokładne wykrywanie
Wady - użycie własnych zasobów serwera do wykrywania
źródło
Wydaje się, że nie jest to możliwe w przypadku żadnej obecnej usługi Google.
Ale są też inne usługi, takie jak usługa zapytań w wektorach współrzędnych JSON ! Po prostu odpytujesz dane w adresie URL i otrzymujesz odpowiedź JSON / XML .
Musisz zarejestrować się i podać swój klucz oraz wybrany numer warstwy. Możesz przeszukiwać wszystkie ich repozytorium dostępnych warstw . Większość warstw ma charakter tylko regionalny, ale można też znaleźć warstwy globalne, takie jak World Coastline :
Po wybraniu warstwy i kliknięciu na zakładkę „Usługi” otrzymasz przykładowy adres URL żądania. Uważam, że wystarczy się zarejestrować i to wszystko!
A teraz najlepsze:
Możesz przesłać swoją warstwę!
Nie jest dostępny od razu, hej trzeba to jakoś przetworzyć, ale powinno działać! Repozytorium warstw wygląda tak, jakby ludzie przesyłali je w miarę potrzeb.
źródło
To, czego używam i działa nieźle ... możesz poprawić test, jeśli masz więcej procesora do zmarnowania, dodając piksele.
źródło
Istnieje darmowy internetowy interfejs API, który dokładnie rozwiązuje ten problem o nazwie onwater.io . To nie jest coś wbudowanego w mapy Google, ale biorąc pod uwagę szerokość i długość geograficzną, dokładnie zwróci prawdę lub fałsz za pośrednictwem żądania get.
Przykład na wodzie: https://api.onwater.io/api/v1/results/23.92323,-66.3
Przykład na lądzie: https://api.onwater.io/api/v1/results/42.35,-71.1
Pełne ujawnienie Pracuję w Dockwa.com , firmie stojącej za onwater. Zbudowaliśmy na wodzie, aby sami rozwiązać ten problem i pomóc społeczności. Jest darmowy (płatny za duży wolumen) i chcieliśmy się nim podzielić :)
źródło
Pomyślałem, że bardziej interesujące byłoby wykonanie tego zapytania lokalnie, więc mogę być bardziej samodzielny: powiedzmy, że chcę wygenerować 25000 losowych współrzędnych lądowych naraz, wolałbym raczej uniknąć wywołań potencjalnie kosztownych zewnętrznych interfejsów API. Oto moje ujęcie w Pythonie, na przykładzie Pythona wspomnianym przez TomSchober. Zasadniczo wyszukuje współrzędne w gotowym pliku 350 MB zawierającym wszystkie współrzędne lądowe, a jeśli współrzędne tam istnieją, drukuje je.
Wypróbowałem kilkanaście współrzędnych, działa cudownie. Plik „land_polygons.shp” można pobrać tutaj , komplementy dla OpenStreetMaps. (Sam użyłem pierwszego linku do pobrania WGS84, może drugi też działa)
źródło
natural=coastline
. Szybkie wyszukiwanie w Google daje użycie tej strony, która wyraźnie stwierdza, że tagi wybrzeża w rzeczywistości nie mają zastosowania do jezior w ich nomenklaturze. Więc powiedziałbym, że nie , moja metoda nie identyfikuje jezior jako wody, ponieważ zestaw danych, którego używam, nie identyfikuje. Ale spróbuj sam!Sprawdź ten artykuł . Dokładnie wykrywa, czy coś jest na wodzie, bez konieczności posiadania serwera. To sztuczka polegająca na niestandardowej funkcji stylizacji w Mapach Google.
źródło
Oprócz odwrotnego geokodowania - jak zauważył dr Molle , może ono zwrócić ZERO_RESULTS - możesz skorzystać z usługi Elevation. Jeśli uzyskasz zero wyników przez odwrotne geokodowanie, uzyskaj wysokość lokalizacji. Ogólnie poziom morza jest ujemny, ponieważ dno morskie znajduje się poniżej poziomu morza. Jest w pełni opracowany przykład usługi elewacji.
Pamiętaj, że ponieważ Google nie udostępnia tych informacji, żadna inna metoda jest tylko domysłem, a domysły są z natury niedokładne. Jednak użycie
type
zwróconego przez odwrotne geokodowanie lub wysokości, jeślitype
nie jest dostępna, obejmie większość ewentualności.źródło
Ta metoda jest całkowicie zawodna. W rzeczywistości zwrócone dane będą całkowicie zależeć od tego, z jaką częścią świata pracujesz. Na przykład pracuję we Francji. Jeśli kliknę na morze na wybrzeżu Francji, Google zwróci najbliższą lokalizację LANDU, jaką może „odgadnąć”. Kiedy poprosiłem Google o informacje na to samo pytanie, odpowiedzieli, że nie są w stanie dokładnie zwrócić żądanego punktu na masie wody.
Wiem, że to niezbyt satysfakcjonująca odpowiedź. Jest to dość frustrujące, szczególnie dla tych z nas, którzy zapewniają użytkownikowi możliwość kliknięcia mapy w celu zdefiniowania pozycji znacznika.
źródło
Jeśli wszystko inne zawiedzie, zawsze możesz spróbować sprawdzić wysokość w danym punkcie i na pewną odległość - niewiele rzeczy poza wodą zwykle jest całkowicie płaskich.
źródło
Niestety ta odpowiedź nie znajduje się w interfejsie API Map Google, a odnośny zasób nie jest bezpłatny, ale istnieje usługa internetowa dostarczana przez DynamicGeometry, która ujawnia operację,
GetWaterOrLand
która akceptuje parę szerokość / długość geograficzna ( możesz zobaczyć demo tutaj ).Moje zrozumienie tego, jak to jest realizowane, polega na wykorzystaniu plików kształtów zbiorników wodnych. Jak dokładnie te pliki kształtów są używane z interfejsem API Map Google, ale możesz uzyskać pewne informacje z połączonej wersji demonstracyjnej.
Mam nadzieję, że to w jakiś sposób pomoże.
źródło
Oto kolejny przykład w czystym JavaScript: http://jsfiddle.net/eUwMf/
Jak widać, idea jest w zasadzie taka sama jak rebe100x, pobiera obraz z interfejsu API statycznej mapy Google i odczytuje pierwszy piksel:
źródło
Zobacz odpowiedź, której udzieliłem na podobne pytanie - używa „HIT_TEST_TERRAIN” z Earth Api do osiągnięcia tej funkcji.
Oto działający przykład pomysłu, który przedstawiłem tutaj: http://www.msa.mmu.ac.uk/~fraser/ge/coord/
źródło
Polecam tutaj toczyć własne. Możesz użyć narzędzi takich jak GDAL, aby zapytać o zawartość w punkcie w pliku kształtu. Możesz pobrać pliki shapefiles dla geografii Stanów Zjednoczonych z wielu źródeł, w tym US Census Bureau .
Można to zrobić za pomocą plików binarnych GDAL, źródła C lub przez swig w Javie, Pythonie i nie tylko.
Mapy spisowe
Informacje GDAL
Przykład zapytania punktowego w Pythonie
źródło
Oto proste rozwiązanie
Ponieważ Google nie dostarcza wiarygodnych wyników w odniesieniu do współrzędnych znajdujących się na wodach oceanicznych lub śródlądowych, musisz skorzystać z innej usługi kopii zapasowej, takiej jak Yandex, aby pomóc w dostarczeniu tych krytycznych informacji, gdy ich brakuje. Najprawdopodobniej nie chciałbyś używać Yandex jako swojego głównego geokodera, ponieważ Google jest znacznie lepszy pod względem niezawodności i kompletności danych światowych, jednak Yandex może być bardzo przydatny w celu odzyskiwania danych, gdy dotyczą współrzędnych nad zbiornikami wodnymi, więc używaj obu.
Dokumentacja Yandex: https://api.yandex.com.tr/maps/doc/geocoder/desc/concepts/input_params.xml
Kroki, aby odzyskać nazwę oceanu:
1.) Najpierw użyj Google, aby odwrócić geokodowanie współrzędnych.
2.) Jeśli Google zwraca zero wyników, jest 99% prawdopodobne, że współrzędna leży nad oceanem. Teraz wykonaj drugie żądanie odwrotnego geokodowania z tymi samymi współrzędnymi do Yandex. Yandex zwróci odpowiedź JSON z dokładnymi współrzędnymi, w ramach tej odpowiedzi będą dwie ważne pary „klucz”: „wartość”
Sprawdź klucz rodzaju, jeśli == "hydro" wiesz, że znajdujesz się nad zbiornikiem wodnym, a ponieważ Google zwrócił zero wyników, na 99,99% jest prawdopodobne, że ten zbiornik wodny jest oceanem. Nazwą oceanu będzie powyższy klucz „nazwa”.
Oto przykład, jak używam tej strategii napisanej w języku Ruby
Kroki w celu uzyskania nazwy śródlądowego akwenu:
W tym przykładzie załóżmy, że nasza współrzędna leży gdzieś w jeziorze:
1.) Najpierw użyj Google, aby odwrócić geokodowanie współrzędnych.
2.) Google najprawdopodobniej zwróci wynik będący widocznym adresem domyślnym na pobliskim terenie. W ten sposób dostarcza współrzędne adresu, który zwrócił, te współrzędne nie będą pasować do podanego przez Ciebie. Zmierz odległość między podaną współrzędną a tą, która została zwrócona z wynikiem, jeśli jest ona znacząco różna (na przykład 100 jardów), a następnie wykonaj żądanie dodatkowej kopii zapasowej w Yandex i sprawdź, czy wartość klucza „rodzaj” jest taka jest "hydro", to wiesz, że współrzędna leży na wodzie. Ponieważ Google zwrócił wynik w przeciwieństwie do powyższego przykładu, jest 99,99% prawdopodobne, że jest to zbiornik wodny śródlądowy, więc teraz możesz uzyskać nazwę. Jeśli „kind” nie == „hydro”, użyj geokodowanego obiektu Google.
Oto ten sam kod napisany w Rubim, aby uzyskać inland_body_of_water
Uwaga dotycząca licencjonowania: z tego, co wiem, Google nie zezwala na wykorzystywanie ich danych do wyświetlania na żadnych innych mapach niż te oferowane przez Google. Yandex ma jednak bardzo elastyczne licencje i możesz używać ich danych do wyświetlania na mapach Google.
Yandex ma również wysoki limit 50 000 żądań dziennie bezpłatnie i bez wymaganego klucza API.
źródło
Udało mi się podejść dość blisko, korzystając z Google Elevation API. Oto obraz wyników:
Widzisz, że sześciokąty prawie pozostają na lądzie, mimo że zdefiniowano prostokątny obwód, który częściowo przechodzi nad wodą. W tym przypadku sprawdziłem szybko z samych Google Maps i minimalna wysokość na lądzie wynosiła około 8-9m, czyli taki był mój próg. Kod jest w większości kopiowany / wklejany z dokumentacji Google i Stack Overflow, oto cała istota:
https://gist.github.com/dvas0004/fd541a0502528ebfb825
źródło
Jeśli
List<Address>
adres zwraca 0, możesz przyjąć tę lokalizację jako ocean lub zasoby naturalne. Po prostu dodaj poniższy kod w swojej odpowiedzi Metoda odpowiedzi interfejsu API Miejsc Google.Zainicjuj poniższą listę, jak wspomniano
List<Address> addresses = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1);
if (addresses.size()==0) { Toast.MakeText(getApplicationContext,"Ocean or Natural Resources selected",Toast.LENGTH_SHORT).show(); }else{ }
źródło
Jako kompletny nowicjusz w Pythonie nie mogłem znaleźć rozwiązania SylvainB do pracy ze skryptem Pythona, który sprawdza, czy współrzędne są na lądzie. Jednak udało mi się to rozgryźć, pobierając OSGeo4W ( https://trac.osgeo.org/osgeo4w/ ), a następnie zainstalowałem wszystko, czego potrzebowałem, pip, Ipython i sprawdziłem, czy są tam wszystkie określone importy. Zapisałem następujący kod jako plik .py.
Kod, aby sprawdzić, czy współrzędne są na lądzie
Próbowałem zmusić go do działania w R, ale miałem koszmar, próbując uzyskać wszystkie pakiety, które musisz zainstalować, więc utknęły w Pythonie.
źródło
Mam tutaj inne rozwiązanie. W obecnej implementacji mapy google nie oblicza kierunku / odległości od położenia wody do położenia lądu i odwrotnie. Dlaczego nie użyjemy tej logiki do określenia, czy chodzi o ląd czy wodę.
Weźmy na przykład ten przykład
jeśli chcemy określić, czy punkt
x
jest lądem czy wodą, tosprawdźmy kierunek między punktem
x
a znanym punktem,y
którym jest ląd. Jeśli określa kierunek / odległość, to punktx
jest lądem lub wodą.źródło