지점이 Google지도에서 육지 또는 물인지 확인


106

.. 그리고 구글지도 "물에서 물을 나눕니다"

글쎄요, 성경적인 의미는 아니지만 ..

[Lat, Lon] 지점이 육지인지 물인지 확인하기 위해 어떤 옵션이 있는지 알고 싶습니다.

Google지도에는 분명히이 데이터가 있습니다 (수역은 파란색 임). API에이를 위해 사용할 수있는 것이 있습니까? 그리고 그렇지 않다면-그들은 그것을 생각하지 않았기 때문에 그것을 제공하지 않습니까? 아니면 너무 복잡해서?

이 문제에 대한 정보를 찾지 못했습니다. 여기에서 비슷한 질문 (지형 또는 고도 찾기 등)을 제외하고는 정확히 필요한 것은 아닙니다.

그것을 위해 분리 된 층이 있습니까? 옵션? 명령? 아니면 수동으로해야합니까?

이 방법에 접근하는 방법을 생각할 수있는 유일한 방법 (수동으로 수행해야하는 경우)은 제공된 모든 타일에서 정확한 지점을 확인한 다음 해당 Google지도 색조에 대한 RGB 값을 확인하는 것입니다. 이것은 이론에 불과합니다. 왜냐하면 실제로는 어떻게해야할지 모르겠습니다. 첫 번째 장애물은 예를 들어 타일의 픽셀 위치를 [LatLon] 지점으로 변환 할 수있는 방법을 모릅니다.

준비된 솔루션이 훨씬 쉬울 것입니다.

전 세계의 모든 물이 필요하지는 않습니다 (예 : 시내, 작은 연못, 대부분의 강 또는 이웃의 수영장에 관심이 없습니다. 사람이 떠 다니는 차량의 도움없이 모험 할 수있는 지점이 필요합니다. )

편집 I

댓글을 읽은 후 : 고도 방법은 신뢰할 수 없습니다. 해수면 아래에 너무 많은 장소가 있습니다 ( http://geology.com/below-sea-level/ 여기에서 "가장 깊은"10 개의 목록을 볼 수 있음). 해수면 (호수) 위에 너무 많은 내륙 수역이 있습니다. 역 지리적 위치 방법은 도시, 주 또는 ZERO와 같은 지정 학적 엔티티를 여러 번 반환하므로 신뢰할 수 없습니다. 나는 질문을하기 전에 이미 그 의사 해결책들을 조사해 보았지만, 그들 중 어느 누구도 실제로 질문에 답하지 않았습니다. 이러한 방법은 기껏해야 "추측"이 나쁩니다.


1
고도 라이브러리를 사용할 수 있습니다. 항상 사실은 아니지만 대부분의 경우 해수면 지역의 물에서 일한다고 생각합니다. 다소 명백한 코너 케이스 (Death Valley CA, 네덜란드, 산속의 호수 등)가 있지만 대략적인 근사치로 작동 할 수 있습니다.

덕분에, 나는 이미 생각했다 -하지만 당신은 지적처럼 - 지구에 해수면 아래 너무 많은 포인트가 있습니다 - 모두 제외하고는 실행 가능한 해결책이 아니다 ..
Obmerk 크로 넨을

@michael - 당신이 언급하는 모든 내륙 물에 몸을 말할 것도없고 .. (호수 등)
Obmerk 크로 넨

GIS.SE에 더 적합할까요? 현상금이 종료되면 마이그레이션 할 수 있습니다.
TMS

당신이 대답을받은 것처럼 물 데이터, GIS 정보를 찾고, 잘 별도의 discussiong 우리의 별도의 도메인에가는이 있다면, 나는 그에 말할 게 없다 .. 그러나 http://gis.stackexchange.com/ 여기에 당신이 경우에 당신을 도울 것이다 .. 물 데이터를 포함하여 필요한 수 많은 일을 찾을 것입니다 .. (필요한 경우 ..) 이전 게시물 나는이 의지의 도움을 바랍니다 ..
MarmiK

답변:


55

다음 두 가지 방법을 시도해 볼 수 있습니다.

  • Google Maps Reverse Geocoding을 사용할 수 있습니다 . 결과 집합에서을 확인하여 물인지 여부를 확인할 수 있습니다 types. 물의 경우 유형은 natural_feature. http://code.google.com/apis/maps/documentation/geocoding/#Types 링크에서 자세히 알아보세요 .

    또한 지형지 Sea, Lake, Ocean물에 포함 된 경우 지형지 물의 이름과 더 정확한 물과 관련된 다른 단어 를 확인해야합니다 . 예를 들어 사막도 natural_features입니다.

    장점 -모든 감지 프로세스는 클라이언트의 컴퓨터에서 수행됩니다. 자체 서버 측 서비스를 만들 필요가 없습니다.

    단점 -매우 부정확하며 물에서 "없음"을 얻을 가능성이 매우 높습니다.

  • Google 정적지도 를 사용하여 물 / 토지를 픽셀 단위로 감지 할 수 있습니다 . 그러나이를 위해서는 http 서비스를 만들어야합니다.

    서비스에서 수행해야하는 단계는 다음과 같습니다.

    1. 수신 latitude, longitudecurrent zoom클라이언트에서.
    2. http://maps.googleapis.com/maps/api/staticmap?center={위도 ,경도 }&zoom={현재 확대 / 축소`} & size = 1x1 & maptype = roadmap & sensor = false 요청을 Google 정적지도 서비스에 보냅니다 .
    3. 1x1 정적 이미지의 픽셀 색상을 감지합니다.
    4. 탐지에 대한 정보에 응답합니다.

    클라이언트 측에서 픽셀의 색상을 감지 할 수 없습니다. 예, 클라이언트의 컴퓨터에 정적 이미지를로드하고 canvas요소에 이미지를 그릴 수 있습니다. 그러나 getImageData픽셀의 색상을 얻기 위해 캔버스의 컨텍스트를 사용할 수 없습니다 . 이것은 교차 도메인 정책에 의해 제한됩니다.

    Prons- 매우 정확한 감지

    단점 -탐지를위한 자체 서버 리소스 사용


2
감사합니다-이미 확인했습니다-유형이 Sea Lake Ocean 등으로 바뀌고 있는지 몰랐습니다. 편집에서 지적한 것처럼-natural_feature도 산, 섬, 사막이 될 것입니다. 문서를 가리 킵니까? 또한-주소가없는 장소에 대해 역 지오 코딩을 수행하려면 어떻게해야합니까? 그리고 지리학 적 개체의 일부인 호수는 어떻습니까? 호수 내부 도시 또는 지방 자치제 제한 (예 : genevre) 또는 단순히 도시 항구 내부에있는 지점. 내 시련에서 나는 그렇게하지
못했습니다

3
전 세계 대부분의 물에 대해 역 지오 코딩은 '결과 0'을 반환합니다. geocoding-tool : gmaps-samples-v3.googlecode.com/svn/trunk/geocoder/…를 확인 하고 바다 내부를 클릭합니다.
Dr.Molle

@Tomas-내가 동료 "스태커들"에 대해 대단하지 않거나 존경심을 느끼고 싶지는 않지만 유효 / 정확한 방법이 아니기 때문에 투표가되지 않을 수도 있습니다.
Obmerk Kronen 2012 년

3
제안 된 방식으로 정적지도를 사용하는 것은 약관 (10.1.1 (h)) 을 위반하는 것으로 간주 될 수 있습니다 .
Andrew Leach

1
Static Maps 접근 방식에 관해서는 developers.google.com/maps/documentation/static-maps/… 스타일로 할 수 있지만 링크 된 Saurav 기사를 사용하는 것이 좋습니다.
miguev

19

현재 Google 서비스로는 불가능한 것 같습니다.

그러나 Koordinates Vector JSON Query 서비스 와 같은 다른 서비스가 있습니다 ! URL의 데이터를 쿼리하기 만하면 JSON / XML 응답이 반환 됩니다.

요청 예시 : http://api.koordinates.com/api/vectorQuery.json?key=YOUR_GEODATA_KEY&layer=1298&x=-159.9609375&y=13.239945499286312&max_results=3&radius=10000&geometry=true&with_field_names=true

키와 선택한 레이어 번호를 등록하고 제공해야합니다. 사용 가능한 레이어의 모든 저장소를 검색 할 수 있습니다 . 대부분의 레이어는 지역에만 해당되지만 World Coastline 과 같이 전역 레이어도 찾을 수 있습니다 .

여기에 이미지 설명 입력

계층을 선택하고 "서비스"탭을 클릭하면 예제 요청 URL이 표시됩니다. 등록 만하면된다고 믿습니다.

그리고 이제 최고 :

레이어를 업로드 할 수 있습니다!

바로 사용할 수 없습니다. 어떻게 든 처리해야하지만 작동해야합니다! 레이어 저장소는 실제로 사람들이 필요에 따라 업로드 한 것처럼 보입니다.


이것은 거의 완벽 해 보이지만 오세아니아가 아닌 지역지도는 볼 수 없습니다. 미국 레이어가 있습니까?
HaloWebMaster 2013-06-28

@HaloWebMaster 내가 언급 한 레이어는 글로벌입니다. 또한 지역별로 레이어를 검색 할 수도 있습니다.
TMS

@HaloWebMaster 방금 자신의 레이어를 업로드 할 수 있습니다! 내 업데이트를 참조하십시오.
TMS

이봐, 토마스, 당신이 실제로 현상금을 받았는지 여부는 모르겠지만 (1 주일 동안 오프라인 상태 였기 때문에) 이건 굉장합니다! 도와 주셔서 감사합니다. 제 응용 프로그램을 작동시킬 수 없었을 것입니다. 감사! (당신이 현상금을하지 않은 경우, I, 그냥 오후 날을 reaward 것)
HaloWebMaster

이봐, 당신은 나에게 사용자 지정 코딩의 일주일을 절약했습니다! 그것은 가치!
HaloWebMaster 2013

8

이것은 내가 사용하고 너무 나쁘지 않습니다 ... 픽셀을 추가하여 낭비 할 CPU가 더 많으면 테스트를 향상시킬 수 있습니다.

function isItWatter($lat,$lng) {

    $GMAPStaticUrl = "https://maps.googleapis.com/maps/api/staticmap?center=".$lat.",".$lng."&size=40x40&maptype=roadmap&sensor=false&zoom=12&key=YOURAPIKEY";  
    //echo $GMAPStaticUrl;
    $chuid = curl_init();
    curl_setopt($chuid, CURLOPT_URL, $GMAPStaticUrl);   
    curl_setopt($chuid, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($chuid, CURLOPT_SSL_VERIFYPEER, FALSE);
    $data = trim(curl_exec($chuid));
    curl_close($chuid);
    $image = imagecreatefromstring($data);

    // this is for debug to print the image
    ob_start();
    imagepng($image);
    $contents =  ob_get_contents();
    ob_end_clean();
    echo "<img src='data:image/png;base64,".base64_encode($contents)."' />";

    // here is the test : I only test 3 pixels ( enough to avoid rivers ... )
    $hexaColor = imagecolorat($image,0,0);
    $color_tran = imagecolorsforindex($image, $hexaColor);

    $hexaColor2 = imagecolorat($image,0,1);
    $color_tran2 = imagecolorsforindex($image, $hexaColor2);

    $hexaColor3 = imagecolorat($image,0,2);
    $color_tran3 = imagecolorsforindex($image, $hexaColor3);

    $red = $color_tran['red'] + $color_tran2['red'] + $color_tran3['red'];
    $green = $color_tran['green'] + $color_tran2['green'] + $color_tran3['green'];
    $blue = $color_tran['blue'] + $color_tran2['blue'] + $color_tran3['blue'];

    imagedestroy($image);
    var_dump($red,$green,$blue);
    //int(492) int(570) int(660) 
    if($red == 492 && $green == 570 && $blue == 660)
        return 1;
    else
        return 0;
}

코드가 새 버전에서 작동하지 않습니다. ($는 && $ 녹색 == 627 && == $ 파란색 765 == 537 빨간색) 경우 새로운 버전이 같아야합니다
빔 Pruiksma

8

onwater.io 라는이 문제를 정확히 해결하는 무료 웹 API가 있습니다. Google지도에 내장 된 것은 아니지만 위도와 경도가 주어지면 get 요청을 통해 정확하게 true 또는 false를 반환합니다.

물의 예 : https://api.onwater.io/api/v1/results/23.92323,-66.3

{
  lat: 23.92323,
  lon: -66.3,
  water: true
}

육지의 예 : https://api.onwater.io/api/v1/results/42.35,-71.1

{
  lat: 42.35,
  lon: -71.1,
  water: false
}

전체 공개 저는 onwater 회사 인 Dockwa.com에서 일합니다. 우리는이 문제를 스스로 해결하고 지역 사회를 돕기 위해 물 위에 건설했습니다. 무료로 사용할 수 있으며 (대량 유료) 공유하고 싶었습니다. :)


1
업데이트 된 예제 링크 : 물 예제 : api.onwater.io/api/v1/results/23.92323,-66.3 토지 예제 : api.onwater.io/api/v1/results/42.35,-71.1
Christian K.

1
더 이상 무료는 아니지만 (더 많은 양의 경우), 작동한다면 여전히 매우 저렴합니다!
Christian K.

문서 페이지에 오류가 있습니다. 커버리지 특정 데이터가 있는지 확인하고 싶습니까? 어떤 국가를 다루나요?
nr5

onwater.io는 호수와 강에서 작동합니까? 그렇다면 유형 표시를받을 수 있습니까?
luksch

7

이 쿼리를 로컬에서 수행하는 것이 더 흥미 롭다고 생각했기 때문에 좀 더 자립 할 수 있습니다. 한 번에 25000 개의 임의의 토지 좌표를 생성하고 비용이 많이 드는 외부 API에 대한 호출을 피하고 싶습니다. 다음은 TomSchober가 언급 한 파이썬 예제를 사용하여 파이썬 으로 찍은 사진입니다. 기본적으로 모든 육지 좌표를 포함 하는 미리 만들어진 350MB 파일 에서 좌표를 조회 하고 좌표가 거기에 있으면 인쇄합니다.

import ogr
from IPython import embed
import sys

drv = ogr.GetDriverByName('ESRI Shapefile') #We will load a shape file
ds_in = drv.Open("land_polygons.shp")    #Get the contents of the shape file
lyr_in = ds_in.GetLayer(0)    #Get the shape file's first layer

#Put the title of the field you are interested in here
idx_reg = lyr_in.GetLayerDefn().GetFieldIndex("P_Loc_Nm")

#If the latitude/longitude we're going to use is not in the projection
#of the shapefile, then we will get erroneous results.
#The following assumes that the latitude longitude is in WGS84
#This is identified by the number "4236", as in "EPSG:4326"
#We will create a transformation between this and the shapefile's
#project, whatever it may be
geo_ref = lyr_in.GetSpatialRef()
point_ref=ogr.osr.SpatialReference()
point_ref.ImportFromEPSG(4326)
ctran=ogr.osr.CoordinateTransformation(point_ref,geo_ref)

def check(lon, lat):
    #Transform incoming longitude/latitude to the shapefile's projection
    [lon,lat,z]=ctran.TransformPoint(lon,lat)

    #Create a point
    pt = ogr.Geometry(ogr.wkbPoint)
    pt.SetPoint_2D(0, lon, lat)

    #Set up a spatial filter such that the only features we see when we
    #loop through "lyr_in" are those which overlap the point defined above
    lyr_in.SetSpatialFilter(pt)

    #Loop through the overlapped features and display the field of interest
    for feat_in in lyr_in:
        # success!
        print lon, lat

check(-95,47)

나는 12 개의 코디네이터를 시도했는데 훌륭하게 작동합니다. "land_polygons.shp"파일은 여기 에서 다운로드 할 수 있으며 OpenStreetMaps를 보완합니다. (첫 번째 WGS84 다운로드 링크를 직접 사용했으며 두 번째도 작동 할 수 있습니다)


호수는 어떻습니까? 호수의 포인트를 바다 또는 육지로 간주합니까?
fatma.ekici

좋은 질문! 나는 페이지 에서 내 대답링크 된 OpenStreetMaps 데이터를 확인했고 lands 파일이 태그에 해당 값을 기반으로한다고 말합니다 natural=coastline. 빠른 인터넷 검색은 이 페이지 를 사용 하여 특히 해안선 태그가 명명법에서 호수에 실제로 적용되지 않음을 명시합니다. 그래서 저는 아니오 라고 말하고 싶습니다 . 제가 사용하는 데이터 세트 가 그렇지 않기 때문에 제 방법은 호수를 물로 식별하지 않습니다. 그러나 직접 시도하십시오!
SylvainB


5

Molle 박사 가 지적했듯이 역 지오 코딩 외에도 ZERO_RESULTS를 반환 할 수 있습니다. 고도 서비스를 사용할 수 있습니다. 역 지오 코딩으로 결과가 0 인 경우 위치의 고도를 가져옵니다. 일반적으로 해저가 해수면보다 낮기 때문에 바다는 음수를 얻습니다. 완전히 작동 된 예가 있습니다.고도 서비스의 있습니다.

Google은이 정보를 제공하지 않으므로 다른 방법은 추측 일 뿐이며 추측은 본질적으로 정확하지 않습니다. 그러나 type역 지오 코딩으로 반환 된 값을 사용 하거나 type사용할 수없는 경우 고도를 사용하면 대부분의 상황을 해결할 수 있습니다.


귀하의 답변과 예제 링크에 감사드립니다 (BTW-그것은 나를 위해 Opera에서 작동하지 않습니다)-그러나 토지와 부정적인 모든 영역을 실제로 무시할 수는 없으며 실험 결과 TYPE이 신뢰할 수 없음이 나타났습니다. 가까운 지정 학적 실체. 좀 더 정확한 방법이 있어야합니다. "추측"이 올바른 접근 방식이 아닌 것 같습니다. TYPE이 신뢰할 수 있다면-최선의 해결책이었을 것입니다-하지만 그렇지 않습니다 ... 그리고 당신은 해수면 위에있는 육지로 둘러싸인 모든 수역을 무시하고 있습니다 ...
Obmerk Kronen

3

이 방법은 완전히 신뢰할 수 없습니다. 실제로 반환되는 데이터는 전적으로 작업중인 세계의 어느 부분에 따라 달라집니다. 예를 들어, 저는 프랑스에서 일하고 있습니다. 프랑스 해안의 바다를 클릭하면 Google이 "추측"할 수있는 가장 가까운 LAND 위치를 반환합니다. 이 같은 질문에 대해 Google에 정보를 요청했을 때 그들은 그 지점이 물 덩어리에 대해 요청한 것을 정확하게 반환 할 수 없다고 대답했습니다.

그다지 만족스러운 대답은 아닙니다. 이것은 특히 사용자에게지도를 클릭하여 마커 위치를 정의 할 수있는 기능을 제공하는 우리에게는 매우 실망스러운 일입니다.


1
동의합니다. @ user1113426과 @Andrew Leach가 제안한 방법은 실제 방법이 아닙니다. 사용자에게 "파란색 영역을 클릭하지 마십시오"라고 말하는 것이 낫습니다. 그러나 진지하게-Google이 이러한 기능을 해제하고 싶지 않다는 사실에 매우 놀랍습니다-근사하더라도- "근사치"보다 낫습니다. 포인터처럼 지금은 존재합니다. 때때로 수백 미터 떨어진 위치로 "스냅"됩니다. 심지어 내 제안 방법은 더 ccurate은 (내가 아무 생각이 너무 나쁜이 작업을 수행하는 방법에 대해 설명합니다.)
Obmerk 크로 넨에게

3

다른 모든 방법이 실패하면 항상 해당 지점의 고도를 확인하고 어느 정도 거리를두고 있는지 확인할 수 있습니다. 물 외에는 완전히 평평한 경향이있는 것은 많지 않습니다.


감사합니다, 이것은 좋은 아이디어입니다. 그러나 모든 폭포 나 강 협곡
Obmerk Kronen

2

안타깝게도이 답변은 Google Maps API 내에 없으며 참조 된 리소스는 무료가 아니지만 GetWaterOrLand위도 / 경도 쌍을 허용 하는 작업을 노출하는 DynamicGeometry에서 제공하는 웹 서비스가 있습니다 ( 여기에서 데모를 볼 수 있습니다. ).

이것이 어떻게 구현되는지에 대한 나의 이해는 수체 모양 파일을 사용하는 것입니다. 이러한 모양 파일이 Google Maps API에서 정확히 어떻게 사용되지만 링크 된 데모에서 약간의 통찰력을 얻을 수 있습니다.

어떤 식 으로든 도움이되기를 바랍니다.


2

다음은 순수 JavaScript의 또 다른 예입니다. http://jsfiddle.net/eUwMf/

보시다시피 ideia는 기본적으로 rebe100x와 동일하며 Google 정적지도 API에서 이미지를 가져오고 첫 번째 픽셀을 읽습니다.

$("#xGps, #yGps").change(function() {
    var img = document.getElementById('mapImg');

    // Bypass the security issue : drawing a canvas from an external URL.
    img.crossOrigin='anonymous';

    var xGps = $("#xGps").val();
    var yGps = $("#yGps").val();

    var mapUrl = "http://maps.googleapis.com/maps/api/staticmap?center=" + xGps + "," + yGps +
        "&zoom=14&size=20x20&maptype=roadmap&sensor=false";

    // mapUrl += "&key=" + key;

    $(img).attr("src", mapUrl);

    var canvas = $('<canvas/>')[0];
    canvas.width = img.width;
    canvas.height = img.height;
    canvas.getContext('2d').drawImage(img, 0, 0, img.width, img.height);

    var pixelData = canvas.getContext('2d').getImageData(1, 1, 1, 1).data;

    if (pixelData[0] == 164 &&
        pixelData[1] == 190 &&
        pixelData[2] == 220) {
        $("#result").html("Water");
    } else {
        $("#result").html("Not water");
    }
});



1

다음은 간단한 해결책입니다.

Google은 해양 또는 내륙 수역에있는 좌표와 관련하여 신뢰할 수있는 결과를 제공하지 않으므로 Yandex와 같은 다른 백업 서비스를 사용하여 누락 된 중요한 정보를 제공해야합니다. Google은 세계 데이터의 신뢰성과 완전성이 훨씬 뛰어나므로 Yandex를 기본 지오 코더로 사용하고 싶지 않을 것입니다. 그러나 Yandex는 수역 좌표와 관련하여 데이터를 검색하는 데 매우 유용 할 수 있습니다. 그래서 둘 다 사용하십시오.


Yandex 문서 : https://api.yandex.com.tr/maps/doc/geocoder/desc/concepts/input_params.xml


바다 이름을 검색하는 단계 :

1.) 먼저 Google을 사용하여 좌표를 역 지오 코딩하십시오.

2.) Google이 0 개의 결과를 반환하면 좌표가 바다 위에있을 가능성이 99 %입니다. 이제 Yandex에 동일한 좌표를 사용하여 보조 역 지오 코딩 요청을 만듭니다. Yandex는 정확한 좌표에 대한 JSON 응답을 반환합니다.이 응답에는 두 개의 "키": "값"쌍이 중요합니다.

["GeoObject"]["metaDataProperty"]["GeocoderMetaData"]["kind"]

and

["GeoObject"]["name"]

종류 키를 확인하십시오. == "hydro"이면 수역 위에 있음을 알 수 있습니다. Google이 결과를 0 개 반환했기 때문에이 수역이 바다 일 가능성이 99.99 %입니다. 바다의 이름은 위의 "이름"키가됩니다.

다음은 Ruby로 작성된이 전략을 사용하는 방법의 예입니다.

if result.data["GeoObject"]["metaDataProperty"]["GeocoderMetaData"]["kind"] == "hydro"
     ocean = result.data["GeoObject"]["name"] 
end

내륙 수역 이름을 검색하는 단계 :

이 예에서는 좌표가 호수 어딘가에 있다고 가정합니다.

1.) 먼저 Google을 사용하여 좌표를 역 지오 코딩하십시오.

2.) Google은 대부분의 경우 근처 육지에서 눈에 잘 띄는 기본 주소 인 결과를 반환합니다. 이 결과에서 반환 된 주소의 좌표를 제공하며이 좌표는 제공 한 좌표와 일치하지 않습니다. 제공 한 좌표와 결과와 함께 반환 된 좌표 사이의 거리를 측정 한 다음 (예 : 100 야드) Yandex로 보조 백업 요청을 수행하고 "종류"키의 값이 있는지 확인합니다. 물에 좌표가 있다는 것을 알 수 있습니다. Google이 위의 예와 반대로 결과를 반환했기 때문에 이것이 내륙 수역 일 가능성이 99.99 %이므로 이제 이름을 알 수 있습니다. "kind"가 "hydro"가 아닌 경우 Google 지오 코딩 된 개체를 사용합니다.

["GeoObject"]["metaDataProperty"]["GeocoderMetaData"]["kind"]

and

["GeoObject"]["name"]

다음은 inland_body_of_water를 얻기 위해 Ruby로 작성된 동일한 코드입니다.

if result.data["GeoObject"]["metaDataProperty"]["GeocoderMetaData"]["kind"] == "hydro"
     inland_body_of_water = result.data["GeoObject"]["name"] 
end

라이선스에 대한 참고 사항 : 내가 아는 한 Google은 귀하가 Google에서 제공하는 것 이외의 다른지도에 데이터를 사용하는 것을 허용하지 않습니다. 그러나 Yandex는 매우 유연한 라이선스를 가지고 있으며 데이터를 Google지도에 표시하는 데 사용할 수 있습니다.

또한 Yandex는 무료 요청 / 일 50,000 개의 높은 비율 제한을 가지고 있으며 필수 API 키가 없습니다.


1

Google Elevation API를 사용하여 상당히 가까워졌습니다. 결과 이미지는 다음과 같습니다.

결과 스크린 샷

육각형은 부분적으로 물 위로 지나가는 직사각형 둘레가 정의되어 있어도 육지에 거의 머무르는 것을 볼 수 있습니다. 이 경우 Google지도 자체에서 빠른 확인을했고 육지의 최소 고도는 약 8 ~ 9m 였으므로 이것이 내 임계 값이었습니다. 코드는 대부분 Google 문서 및 Stack Overflow에서 복사 / 붙여 넣기되었으며 전체 요점은 다음과 같습니다.

https://gist.github.com/dvas0004/fd541a0502528ebfb825


참고로 Google Elevation API 문서는 여기에서 찾을 수 있습니다. developers.google.com/maps/documentation/javascript/elevation
dvas0004

2
이것은 가능한 사용의 좋은 예입니다. 그러나 그것은 육지로 둘러싸인 수역에서 영광스럽게 실패 할 것 입니다 (링크 된 이미지 예제에서 Lago di garda-Italy). 다른 솔루션의 가능한 기반으로 사용될 것으로 생각되는 아주 멋진 코드!
Obmerk Kronen

1

만약 List<Address> 주소 0을 반환, 당신은 당신의 응답 Google 지역 정보 API 응답의 방법에 코드 아래 바다와 자연 Resources.Just의 추가 등이 위치를 가정 할 수있다.

언급 한대로 아래 목록 초기화

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{ }


0

Python의 완전한 초보자로서 저는 좌표가 육지에 있는지 확인하는 Python 스크립트와 함께 작동하도록 SylvainB의 솔루션을 얻을 수 없었습니다. 그러나 OSGeo4W ( https://trac.osgeo.org/osgeo4w/) 를 다운로드하여 알아낼 수있었습니다. ) 하고 필요한 모든 것을 pip, Ipython 설치하고 지정된 모든 가져 오기가 거기에 있는지 확인했습니다. 다음 코드를 .py 파일로 저장했습니다.

좌표가 육지에 있는지 확인하는 코드

###make sure you check these are there and working separately before using the .py file 

import ogr
from IPython import embed
from osgeo import osr
import osgeo

import random
#####generate a 1000 random coordinates
ran1= [random.uniform(-180,180) for x in range(1,1001)]
ran2= [random.uniform(-180,180) for x in range(1,1001)]


drv = ogr.GetDriverByName('ESRI Shapefile') #We will load a shape file
ds_in = drv.Open("D:\Downloads\land-polygons-complete-4326\land-polygons-complete-4326\land_polygons.shp")    #Get the contents of the shape file
lyr_in = ds_in.GetLayer(0)    #Get the shape file's first layer

#Put the title of the field you are interested in here
idx_reg = lyr_in.GetLayerDefn().GetFieldIndex("P_Loc_Nm")

#If the latitude/longitude we're going to use is not in the projection
#of the shapefile, then we will get erroneous results.
#The following assumes that the latitude longitude is in WGS84
#This is identified by the number "4236", as in "EPSG:4326"
#We will create a transformation between this and the shapefile's
#project, whatever it may be
geo_ref = lyr_in.GetSpatialRef()
point_ref=osgeo.osr.SpatialReference()
point_ref.ImportFromEPSG(4326)
ctran=osgeo.osr.CoordinateTransformation(point_ref,geo_ref)
###check if the random coordinates are on land
def check(runs):
    lon=ran1[runs]
    lat=ran2[runs]
    #Transform incoming longitude/latitude to the shapefile's projection
    [lon,lat,z]=ctran.TransformPoint(lon,lat)
    #Create a point
    pt = ogr.Geometry(ogr.wkbPoint)
    pt.SetPoint_2D(0, lon, lat)
    #Set up a spatial filter such that the only features we see when we
    #loop through "lyr_in" are those which overlap the point defined above
    lyr_in.SetSpatialFilter(pt)
    #Loop through the overlapped features and display the field of interest
    for feat_in in lyr_in:
        return(lon, lat)

###give it a try
result = [check(x) for x in range(1,11)] ###checks first 10 coordinates

나는 그것을 R에서 작동 시키려고 노력했지만 설치하는 데 필요한 모든 패키지를 가져 오려는 악몽이있어서 파이썬에 집착했습니다.


-3

여기에 다른 해결책이 있습니다. 현재 Google지도 구현에서는 물 위치에서 육지 위치까지의 방향 / 거리를 계산하지 않으며 그 반대의 경우도 마찬가지입니다. 이 논리를 사용하여 지점이 육지인지 물인지 결정하는 이유는 무엇입니까?

예를 들어이 예를 들어 보겠습니다.

지점 x이 육지인지 물 인지 확인하려면

지점 xy육지 인 알려진 지점 사이의 방향을 확인하겠습니다 . 방향 / 거리를 결정하면 점 x은 육지이거나 그렇지 않으면 물입니다.


실제로 시도해 보셨나요? 아니면 그냥 "물로 요리하기"라고 생각하십니까?
TMS

그리고 교량을 어떻게 처리할까요? 아니면 터널?
Obmerk Kronen 2016
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.