Googleマップでポイントが土地か水かを確認します


106

..そしてグーグルマップは「水から水を分ける」

まあ、聖書的な意味ではなく

[Lat、Lon]のポイントが土地か水かを確認するためにどのようなオプションがあるか知りたいのですが。

Googleマップには明らかにこのデータがあります(水域は青色です)。ただし、APIに使用できるものはありますか?そしてそうでなければ-彼らはそれを考えたことがないので彼らはそれを提供していませんか?それとも複雑すぎますか?

私は問題に関する情報を見つけていません-ここでいくつかの同様の質問(地形のタイプや標高を見つけるなど)を除いて、それは私が必要とするものではありません)。

そのための別のレイヤーはありますか?オプション?コマンド?それとも手動で行うべきですか?

これにアプローチする方法を考えることができる唯一の方法(手動で行う必要がある場合)は、提供されるすべてのタイルの正確なポイントを確認してから、そのGoogleマップの色相のRGB値を確認することです。これは理論上のものです-実際には-それを達成する方法がわからないので、最初の障害は、たとえばタイル上のピクセル位置を[LatLon]ポイントに変換する方法がわからないことです。

既製のソリューションの方がはるかに簡単です。

私は世界のすべての水を必要としないことに注意してください(たとえば、私は小川、小さな池、ほとんどの川、またはあなたの隣人のプールについて気にしません。人が水上車の助けなしに冒険できるポイントが必要です)

編集I

コメントを読んだ後:標高方式は信頼できません。海抜より下の場所が多すぎます(「最も深い」10のリストは、http://geology.com/below-sea-level/で確認できます)。海抜(湖)を超える内陸の水域が多すぎる。逆ジオロケーション方式は、都市や州などの地政学的エンティティを返すため、信頼性がありません-または何度もゼロ。私は質問をする前にそれらの疑似ソリューションをすでに調べましたが、実際に質問に答えたものはありません-これらの方法はせいぜい「推測」でしかありません。


1
標高ライブラリを使用できる場合があります。それは常に当てはまるわけではありませんが、ほとんどの場合、海抜では水が流れていると思います。かなり明白なコーナーケース(Death Valley CA、オランダ、山の湖など)がありますが、おおよその概算で機能する場合があります。

おかげで、私はすでにそのことを考えました-指摘したように-地球の海面下にポイントが多すぎます
Obmerk Kronen


おそらくGIS.SEにより適していますか?バウンティの終了時に移行できます。
TMS 2013年

あなたは答えを受けてきたように、私はそれに何も言うことはありません..しかし、水のデータ、またはGIS情報を探している場合は、よく私たちの別のドメイン上に行く別のdiscussiongがあるhttp://gis.stackexchange.com/ここ、あなたはあなたが必要とするかもしれない多くのものを見つけるでしょう、それは水のデータを含みます..それはあなたを助けるでしょう..(必要なら..)Old Postこれが役に立てば幸いです..
MarmiK

回答:


55

次の2つの方法があります。

  • Googleマップの逆ジオコーディングを使用できます。結果セットでは、をチェックすることで、それが水かどうかを判断できますtypes。ウォーターズの場合、タイプはnatural_featureです。詳細については、このリンクhttp://code.google.com/apis/maps/documentation/geocoding/#Typesをご覧ください

    また、フィーチャの名前と、Sea, Lake, Ocean水域に関連する他の単語が含まれている場合は、それらの名前をチェックして精度を上げる必要があります。たとえば、砂漠もnatural_featuresです。

    長所 -すべての検出プロセスはクライアントのマシンで行われます。独自のサーバー側サービスを作成する必要はありません。

    短所 -非常に不正確であり、海で「なし」になる可能性は非常に高いです。

  • Google Static Mapsを使用すると、ピクセル単位で水や土地を検出できます。ただし、この目的のためにhttpサービスを作成する必要があります。

    これらはあなたのサービスが実行しなければならないステップです:

    1. 受信latitudelongitudeおよびcurrent zoomクライアントから。
    2. 送信http://maps.googleapis.com/maps/api/staticmap?center={緯度,経度}&zoom={電流zoom`}&サイズ= 1x1の&のMapType =ロードマップ&センサー= Googleの静的マップサービスに偽要求。
    3. 1x1静止画像のピクセルの色を検出します。
    4. 検出に関する情報に応答します。

    クライアント側でピクセルの色を検出できません。はい、クライアントのマシンに静的画像を読み込んで、canvas要素に画像を描画できます。ただしgetImageData、ピクセルの色を取得するためにキャンバスのコンテキストを使用することはできません。これは、クロスドメインポリシーによって制限されています。

    Prons-非常に正確な検出

    短所 -検出のための独自のサーバーリソースの使用


2
ありがとう-私はすでにそれをチェックしました-タイプがシーレイクオーシャンなどを回していることを知りませんでした、そしてあなたの編集で指摘したように-natural_featureは山、島、そして砂漠でもあります。ドキュメントを指す?また、住所のない場所のリバースジオコーディングを行うにはどうすればよいですか。そして、地質学的実体の一部である湖はどうですか?..私はそうすることをfaildてきた私の臨床試験.IN都市ポートINSIDEですウィッヒ湖INSIDE都市や(例えばgenevre用)自治体の制限または単にポイントのような
Obmerk Kronenの

3
世界のほとんどの水の場合、リバースジオコーディングは「ゼロの結果」を返します。ジオコーディングツールを確認してください:gmaps-samples-v3.googlecode.com/svn/trunk/geocoder/…、海のどこかをクリックします。
Dr.Molle

@Tomas-私は仲間の「スタッカー」にとって大嫌いでも無礼でもありたいわけではありません-しかし、それは有効/正確な方法ではないため、おそらく投票されませんか?
Obmerk Kronen 2012

3
提案された方法で静的マップを使用すると、おそらく規約に違反したと見なされます(10.1.1(h))。
Andrew Leach

1
スタティックマップのアプローチとして、あなたはスタイルでそれを行うことができますdevelopers.google.com/maps/documentation/static-maps/...が、同様にSauravは、リンク先の記事を使用する場合があります。
miguev 2016年

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

キーと選択したレイヤー番号を登録して提供する必要があります。利用可能なレイヤーのすべてのリポジトリを検索できます。レイヤーのほとんどは地域のみですが、世界の海岸線のようにグローバルも見つけることができます。

ここに画像の説明を入力してください

レイヤーを選択して[サービス]タブをクリックすると、リクエストURLの例が表示されます。登録するだけでいいと思います。

そして今最高:

レイヤーをアップロードできます!

それはすぐには利用できません、どういうわけかそれを処理する必要がありますが、それはうまくいくはずです!レイヤリポジトリは、実際には、必要に応じて人々がアップロードしたように見えます。


これはほぼ完璧に見えますが、オセアニア以外のローカルマップは表示されません。USレイヤーはありますか?
HaloWebMaster 2013年

@HaloWebMaster私が言及したレイヤーはグローバルです。また、地域別にレイヤーを検索することもできます。
TMS 2013年

@HaloWebMaster自分のレイヤーをアップロードできることに気づきました!私のアップデートを見てください。
TMS 2013

ねえ、トーマス、あなたが賞金を実際に手に入れたかどうかはわかりませんが(私は1週間オフラインだったので)、これは素晴らしいです!ご協力いただきありがとうございます。私のアプリケーションを機能させることができなかったでしょう。ありがとう!(あなたが賞金を得られなかった場合、私はそれを後退させます、ちょうど私をPMしてください)
HaloWebMaster 2013

ねえ、あなたは私にカスタムコーディングの1週間を節約しました!価値があります!
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;
}

コードは新しいバージョンでは機能しません。新しいバージョンは次のようになるはずです($ red == 537 && $ green == 627 && $ blue == 765)
Wim Pruiksma

8

onwater.ioと呼ばれるこの問題を正確に解決する無料のWeb 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
}

完全な開示私はオンウォーターの背後にある会社である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
それはもはや無料ではありませんが(ボリュームが大きい場合)、それでもうまくいくなら、それでも非常に手頃な価格です!
クリスチャンK.

ドキュメントページにエラーがあります。カバレッジ固有のデータがあるかどうかを確認したいですか?どの国をカバーするのですか?
nr5

onwater.ioは湖や川で機能しますか?もしそうなら、私はタイプの指標を得ますか?
luksch

7

このクエリをローカルで実行する方が面白いと思ったので、より自立できるようになりました。たとえば、一度に25000個のランダムな土地座標を生成したい場合、コストがかかる可能性のある外部APIへの呼び出しを避けたいとしましょう。これは、TomSchoberによって言及されたpythonの例を使用した、Pythonでの私のショットです。基本的には、すべての土地座標を含むあらかじめ作成された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)

私は十数の座標を試しました、それは素晴らしく機能します。「land_polygons.shp」ファイルは、OpenStreetMapsの賛辞としてここからダウンロードできます。(私は最初のWGS84ダウンロードリンクを自分で使用しました。おそらく2番目のリンクも同様です)


湖はどうですか?湖上のポイントを海または陸と見なしますか?
fatma.ekici 2017年

良い質問!私の回答リンクされたOpenStreetMapsデータにページをチェックしましたが、landsファイルはその値がタグに基づいていることを示していnatural=coastlineます。簡単なグーグルでこのページを使用すると、海岸線のタグは実際には命名法の湖には適用されないことが明記されています。私はそれを言うので何の、私の方法はないではない、私が使用しているデータセットがないので、水のような湖を特定していません。しかし、自分で試してみてください!
SylvainB 2017年

7

この記事をチェックしてください。サーバーがなくても、何かが水面にあるかどうかを正確に検出します。これは、Googleマップのカスタムスタイル機能に依存するハックです。


5

逆ジオコーディングに加えて-Molle 博士が指摘したように、それはZERO_RESULTSを返す可能性があります-Elevationサービスを使用できます。逆ジオコーディングで結果がゼロの場合は、場所の標高を取得します。一般的に、海底は海面より低いため、海は負の数になります。高度なサービスの完全に機能するがあります。

Googleはこの情報を利用可能にしないため、他の方法は単なる推測であり、推測は本質的に不正確であることに注意してください。ただしtype、リバースジオコーディングによって返された、またはtype利用できない場合は標高を使用すると、ほとんどの不測の事態に対応できます。


あなたの答えとサンプルリンクに感謝します(BTW-それは私にとってOperaでは機能していません)-しかし私は土地と否定的なすべての領域を本当に無視することはできません、そして私の実験はTYPEが信頼できないことを示しました-そして何度も戻ります近くの地政学的エンティティ。より正確な方法が必要です-「推測」はここでは適切なアプローチではないようです。TYPEが信頼できる場合-それは最善の解決策でした-しかし、それは...ではなく、海抜より上にあるすべての内陸水域を無視しています...
Obmerk Kronen

3

この方法は完全に信頼できません。実際、返されるデータは、作業している世界のどの部分に完全に依存します。たとえば、フランスで働いています。フランスの海岸の海をクリックすると、Googleは「推測」できる最も近いLANDロケーションを返します。この同じ質問についてGoogleに情報を要求したところ、彼らは、水塊で要求された点を正確に返すことができないと答えました。

あまり満足のいく答えではありません、私は知っています。これは、特にマップをクリックしてマーカーの位置を定義する機能をユーザーに提供する私たちにとって、非常にイライラします。


1
同意します。@ user1113426および@Andrew Leachによって提案されたメソッドは、実際にはメソッドではありません。ユーザーに「青い領域をクリックしないでください」と伝える方が良いです:-)しかし、真剣に-Googleがそのような関数をリリースしたくないことを非常に驚いています-たとえ近似であっても-それは「近似」よりも優れています現在存在しています-ポインタのように-時には数百メートル離れた場所に「スナップ」します。私が提案した方法でもより正確です(残念ながら、これを達成する方法がわかりません。)
Obmerk Kronen

3

他のすべてが失敗した場合は、常にポイントの標高とある程度の距離の高さを確認してみることができます。水以外のものは完全に平らになることはあまりありません。


おかげで、これは素晴らしいアイデアですが、すべての滝や川の峡谷で見事に失敗するでしょう...
Obmerk Kronen

2

残念ながら、この回答はGoogle Maps API内にはなく、参照されるリソースは無料ではありませんがGetWaterOrLand、緯度/経度のペアを受け入れる操作を公開するDynamicGeometryによって提供されるWebサービスがありますここでデモを見ることができます)。

これがどのように実装されるかについての私の理解は、水域形状ファイルを使用することです。これらのシェイプファイルがGoogle Maps APIでどのように使用されるかを正確に示しますが、リンクされたデモからある程度の洞察を得ることができる場合があります。

それが何らかの形で役立つことを願っています。


2

次に、純粋なJavaScriptの別の例を示します。http://jsfiddle.net/eUwMf/

ご覧のように、アイデアは基本的に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");
    }
});


2

ここで自分でロールすることをお勧めします。GDALなどのツールを使用して、シェープファイルのポイントの下にあるコンテンツをクエリできます。米国国勢調査局など、多くのソースから米国の地理のシェープファイルを入手できます。

これは、GDALバイナリ、ソースC、またはJava、Pythonなどのswigを介して実行できます。

国勢調査地図

GDAL情報

Pythonでのポイントクエリの例


1

ここに簡単な解決策があります

Googleは、海または内陸の水域にある座標に関して信頼できる結果を提供しないため、Yandexなどの別のバックアップサービスを使用して、欠落しているときに重要な情報を提供する必要があります。Googleは世界のデータの信頼性と完全性にはるかに優れているため、Yandexをプライマリジオコーダーとして使用することはほとんどありませんが、Yandexは、水域の座標に関連するデータを取得する目的で非常に役立ちます。両方使用してください。


Yandexのドキュメント:https : //api.yandex.com.tr/maps/doc/geocoder/desc/concepts/input_params.xml


海の名前を取得する手順:

1.)最初にGoogleを使用して座標を逆ジオコーディングします。

2.)Googleがゼロの結果を返す場合、座標は海洋上にある可能性が99%あります。次に、Yandexと同じ座標を使用して、セカンダリの逆ジオコーディングリクエストを作成します。Yandexは、正確な座標のJSON応答を返します。この応答内には、重要な2つの「キー」:「値」ペアがあります

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

and

["GeoObject"]["name"]

種類のキーを確認します。== "hydro"の場合、水域を超えていることがわかります。Googleはゼロの結果を返したため、この水域は海である可能性が99.99%です。海の名前は上の「名前」キーになります。

Rubyで記述されたこの戦略の使用例を以下に示します

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

Inland Body of Waterの名前を取得する手順:

この例では、座標がどこかの湖にあると想定します。

1.)最初にGoogleを使用して座標を逆ジオコーディングします。

2.)Googleは、近くの土地の目立つデフォルトの住所である結果を返す可能性が最も高いです。この結果では、返された住所の座標が提供されます。この座標は、指定した座標と一致しません。指定した座標と結果で返された座標の間の距離を測定します。大幅に異なる場合(たとえば100ヤード)、Yandexを使用して2次バックアップリクエストを実行し、「種類」キーの値を確認します。 「水力発電」の場合、座標は水上にあることがわかります。上記の例とは対照的に、Googleが結果を返したため、これは99.99%の確率でこれは内陸の水域であると考えられ、名前を取得できます。「種類」が==「ハイドロ」でない場合は、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



2
これは可能な使用法の素晴らしい例です。しかし、陸地の水域では見事に失敗します(リンクされた画像の例では、Lago di garda-イタリア)。別のソリューションの可能な基礎として使用されると考えられている非常に素晴らしいコード!
Obmerk Kronen

1

List<Address>アドレスが0を返す場合、この場所は海または天然資源であると想定できます。GooglePlaces API応答の応答メソッドに以下のコードを追加するだけです。

前述のようにリストの下を初期化

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/)をダウンロードして、必要なものすべてをインストールし、指定されたすべてのインポートがそこにあることを確認して、それを把握することができました。次のコードを.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で動作させようとしましたが、インストールする必要があるすべてのパッケージをpythonにこだわって取得しようとする悪夢がありました。


-3

ここに別の解決策があります。現在のGoogleマップの実装では、水の位置から土地の位置への方向/距離、およびその逆の方向/距離は計算されません。このロジックを使用して、ポイントが土地か水かを判断しないのはなぜですか。

たとえば、この例を見てみましょう

ポイントxが土地か水かを判断したい場合は、

ポイントxy土地である既知のポイントの間の方向を確認してみましょう。それが方向/距離を決定する場合、ポイントxは土地またはそれ以外の場合は水です。


実際に試したことがありますか、それとも「水から調理する」ことを想定していますか?
TMS 2013

また、ブリッジをどのように処理すると思いますか?またはトンネル?
Obmerk Kronen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.