ตรวจสอบว่าจุดคือที่ดินหรือน้ำใน Google Maps


107

.. แล้ว Google แผนที่ "แบ่งน่านน้ำจากน่านน้ำ"

ไม่ใช่ในแง่พระคัมภีร์ แต่ ..

ฉันอยากทราบว่าฉันมีทางเลือกอะไรบ้างเพื่อตรวจสอบว่าจุดของ [Lat, Lon] เป็นที่ดินหรือน้ำ

เห็นได้ชัดว่า Google Maps มีข้อมูลนี้ (แหล่งน้ำเป็นสีน้ำเงิน) แต่มีบางอย่างใน API ที่ฉันสามารถใช้เพื่อสิ่งนั้นได้หรือไม่ และถ้าไม่ - พวกเขาไม่ได้ให้บริการเพราะไม่เคยคิดมาก่อนหรือ? หรือเพราะมันซับซ้อนเกินไป?

ฉันไม่พบข้อมูลใด ๆ เกี่ยวกับเรื่องนี้ยกเว้นคำถามที่คล้ายกันที่นี่ (เช่นการค้นหาประเภทของภูมิประเทศหรือระดับความสูง - แต่ไม่ใช่สิ่งที่ฉันต้องการ)

มีชั้นแยกสำหรับสิ่งนั้นหรือไม่? ตัวเลือก? คำสั่ง? หรือควรไปดำเนินการด้วยตนเอง?

วิธีเดียวที่ฉันสามารถคิดว่าจะเข้าถึงสิ่งนี้ได้อย่างไร (ฉันควรจะต้องทำด้วยตนเองหรือไม่) คือตรวจสอบไทล์ที่แสดงทุกรายการเพื่อหาจุดที่แน่นอนจากนั้นตรวจสอบค่า RGB สำหรับเฉดสีแผนที่ Google นั้น นี่เป็นเพียงทฤษฎี - เพราะในทางปฏิบัติ - ฉันไม่รู้ว่าจะทำสิ่งนั้นให้สำเร็จได้อย่างไรอุปสรรคแรกคือฉันไม่รู้ว่าฉันจะแปลงตำแหน่งพิกเซลบนกระเบื้องเป็นจุด [LatLon] ได้อย่างไร

โซลูชันสำเร็จรูปจะง่ายกว่ามาก

โปรดทราบว่าฉันไม่ต้องการน้ำทั้งหมดในโลก (เช่น - ฉันไม่สนใจลำธารสระน้ำเล็ก ๆ แม่น้ำส่วนใหญ่หรือสระว่ายน้ำของเพื่อนบ้านของคุณฉันต้องการจุดที่คนสามารถผจญภัยได้โดยไม่ต้องใช้ยานพาหนะลอยน้ำ )

แก้ไข I

หลังจากอ่านความคิดเห็น: วิธีการยกระดับไม่น่าเชื่อถือมีสถานที่ที่ต่ำกว่าระดับน้ำทะเลมากเกินไป (คุณสามารถดูรายชื่อ 10 "ที่ลึกที่สุด" ได้ที่นี่http://geology.com/below-sea-level/ ) และที่นั่น มีแหล่งน้ำขังบนบกมากเกินไปเหนือระดับน้ำทะเล (ทะเลสาบ) วิธีการระบุตำแหน่งทางภูมิศาสตร์แบบย้อนกลับไม่น่าเชื่อถือเนื่องจากจะส่งคืนหน่วยงานทางภูมิศาสตร์เช่นเมืองหรือรัฐหรือเป็นศูนย์หลายครั้ง ฉันได้ดูวิธีแก้ปัญหาหลอกเหล่านั้นก่อนที่จะถามคำถาม - แต่ไม่มีใครตอบคำถามได้จริง - วิธีการเหล่านั้นเป็นการ "เดา" ที่ไม่ดี


1
คุณอาจสามารถใช้ไลบรารีระดับความสูงได้ แม้ว่ามันจะไม่เป็นความจริงเสมอไป แต่ฉันคิดว่าเวลาส่วนใหญ่สิ่งที่อยู่ในระดับน้ำทะเล มีบางกรณีที่ค่อนข้างชัดเจน (Death Valley CA, เนเธอร์แลนด์, ทะเลสาบในภูเขา ฯลฯ ) แต่อาจใช้การประมาณคร่าวๆได้

ขอบคุณฉันได้คิดแล้ว - แต่เหมือนที่คุณชี้ให้เห็น - มีจุดต่ำกว่าระดับน้ำทะเลบนโลกมากเกินไป - การยกเว้นทั้งหมดไม่ใช่วิธีแก้ปัญหาที่ทำได้ ..
Obmerk Kronen

@michael - ไม่ต้องพูดถึงแหล่งน้ำที่ขังบนบกทั้งหมดที่คุณกล่าวถึง .. (ทะเลสาบ ฯลฯ .. )
Obmerk Kronen

อาจจะเหมาะกับ GIS.SE มากกว่า? คุณสามารถโยกย้ายได้เมื่อหมดค่าหัว
TMS

ตามที่คุณได้รับคำตอบฉันไม่มีอะไรจะพูดในเรื่องนั้น .. แต่หากกำลังมองหาข้อมูลน้ำหรือข้อมูล GIS ก็มีการอภิปรายแยกต่างหากที่เกิดขึ้นในโดเมนแยกต่างหากของเราhttp://gis.stackexchange.com/ที่นี่ คุณจะพบหลายสิ่งที่คุณอาจต้องการรวมถึงข้อมูลน้ำ .. ที่จะช่วยคุณได้ในกรณี .. (ถ้าจำเป็น .. ) โพสต์เก่าฉันหวังว่านี่จะช่วยได้ ..
MarmiK

คำตอบ:


55

มี 2 ​​วิธีที่แตกต่างกันคุณสามารถลอง:

  • คุณสามารถใช้Google Maps ย้อนกลับระบุพิกัดทางภูมิศาสตร์ typesในชุดผลลัพธ์ที่คุณสามารถตรวจสอบไม่ว่าจะเป็นน้ำจากการตรวจสอบ natural_featureในกรณีที่น้ำประเภทคือ ดูเพิ่มเติมที่ลิงค์นี้http://code.google.com/apis/maps/documentation/geocoding/#Types http://code.google.com/apis/maps/documentation/geocoding/#Types

    นอกจากนี้คุณต้องตรวจสอบชื่อของสถานที่ต่างๆหากมีSea, Lake, Oceanและคำอื่น ๆ ที่เกี่ยวข้องกับน้ำเพื่อความแม่นยำยิ่งขึ้น ตัวอย่างเช่นทะเลทรายก็เช่นกันnatural_featureเช่นกัน

    ข้อดี - กระบวนการตรวจจับทั้งหมดจะทำบนเครื่องของลูกค้า ไม่จำเป็นต้องสร้างบริการฝั่งเซิร์ฟเวอร์เอง

    จุดด้อย - ไม่ถูกต้องมากและโอกาสที่คุณจะได้รับ "ไม่มี" ที่น่านน้ำนั้นสูงมาก

  • คุณสามารถตรวจสอบน้ำ / ดินแดนโดยพิกเซลโดยใช้Google แผนที่แบบคงที่ แต่เพื่อจุดประสงค์นี้คุณต้องสร้างบริการ http

    นี่คือขั้นตอนที่บริการของคุณต้องดำเนินการ:

    1. ได้รับlatitude, longitudeและcurrent zoomจากลูกค้า
    2. ส่งhttp://maps.googleapis.com/maps/api/staticmap?center={ละติจูด,ลองจิจูด}&zoom={ซูมปัจจุบัน`} & size = 1x1 & maptype = แผนงานและเซ็นเซอร์ = คำขอเท็จไปยังบริการ Google Static Map
    3. ตรวจจับสีของพิกเซลของภาพนิ่ง 1x1
    4. ตอบกลับข้อมูลเกี่ยวกับการตรวจจับ

    คุณไม่สามารถตรวจจับสีของพิกเซลในฝั่งไคลเอ็นต์ ได้คุณสามารถโหลดภาพนิ่งบนเครื่องของลูกค้าและวาดภาพบนcanvasองค์ประกอบได้ แต่คุณไม่สามารถใช้getImageDataบริบทของผืนผ้าใบเพื่อรับสีของพิกเซลได้ สิ่งนี้ถูก จำกัด โดยนโยบายข้ามโดเมน

    Prons - การตรวจจับที่แม่นยำสูง

    จุดด้อย - การใช้ทรัพยากรเซิร์ฟเวอร์ของตัวเองในการตรวจจับ


2
ขอบคุณ - ฉันได้ตรวจสอบแล้ว - ฉันไม่รู้ว่าประเภทต่างๆกำลังเปลี่ยน Sea Lake Ocean และความชอบและเหมือนที่คุณชี้ไว้ในการแก้ไขของคุณ - natural_feature ก็จะเป็นภูเขาเกาะและทะเลทรายด้วย .. คุณอาจจะ ชี้ไปที่เอกสาร? ด้วย - คุณจะทำ geocoding ย้อนกลับสำหรับสถานที่ที่ไม่มีที่อยู่ได้อย่างไร แล้วทะเลสาบที่เป็นส่วนหนึ่งของหน่วยงานภูมิสารสนเทศล่ะ? เหมือนทะเลสาบข้างในขีด จำกัด ของเมืองหรือเขตเทศบาล (เช่นเจเนอเรชั่น) หรือจุดที่อยู่ข้างในท่าเรือของเมืองในการทดลองของฉันฉัน
ล้มเหลว

3
สำหรับน้ำส่วนใหญ่ในโลกการระบุพิกัดทางภูมิศาสตร์แบบย้อนกลับจะให้ผลลัพธ์เป็น "ศูนย์" ให้ตรวจสอบเครื่องมือ geocoding: gmaps-samples-v3.googlecode.com/svn/trunk/geocoder/…แล้วคลิกที่ใดที่หนึ่งในมหาสมุทร
Dr.Molle

@ โทมัส - ไม่ใช่ว่าฉันอยากจะไม่พอใจหรือไม่สุภาพสำหรับ "คนซ้อน" - แต่บางทีมันอาจจะไม่ได้รับการโหวตเพราะมันไม่ใช่วิธีที่ถูกต้อง / ถูกต้อง?
Obmerk Kronen

3
การใช้แผนที่แบบคงที่ตามวิธีที่เสนออาจถือได้ว่าเป็นการละเมิดข้อกำหนด (10.1.1 (ซ))
Andrew Leach

1
สำหรับวิธีการแผนที่แบบคงที่คุณสามารถทำได้ด้วย style developers.google.com/maps/documentation/static-maps/…แต่อาจใช้บทความที่เชื่อมโยงกับ Saurav ด้วยเช่นกัน
miguev

19

ดูเหมือนจะเป็นไปไม่ได้กับบริการปัจจุบันของ Google

แต่ยังมีบริการอื่น ๆ เช่นบริการKoordinates Vector JSON Query ! เพียงคุณค้นหาข้อมูลใน URL และคุณจะได้รับกลับมาตอบสนอง / XML JSON

ตัวอย่างคำขอ: 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

@HaloWebMaster เลเยอร์ที่ฉันพูดถึงคือระดับโลก และคุณยังสามารถค้นหาเลเยอร์ตามภูมิภาคได้อีกด้วย
TMS

@HaloWebMaster ฉันเพิ่งสังเกตว่าคุณสามารถอัปโหลดเลเยอร์ของคุณเองได้! ดูการอัปเดตของฉัน
TMS

เฮ้โทมัสฉันไม่รู้ว่าคุณได้รับเงินรางวัลจริงหรือไม่ (เนื่องจากฉันออฟไลน์มา 1 สัปดาห์) แต่มันยอดเยี่ยมมาก! ขอบคุณสำหรับความช่วยเหลือฉันไม่สามารถรับใบสมัครไปทำงานได้ ขอบคุณ! (ถ้าคุณไม่ได้รับเงินรางวัลฉันจะตอบแทนมันเพียงแค่ PM ฉัน)
HaloWebMaster

เฮ้คุณช่วยฉันหนึ่งสัปดาห์ในการเขียนโค้ดแบบกำหนดเอง! มันคุ้มค่า!
HaloWebMaster

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

Code doens; ไม่สามารถใช้ได้กับเวอร์ชันใหม่ เวอร์ชันใหม่ควรเป็นเช่นนี้ถ้า ($ red == 537 && $ green == 627 && $ blue == 765)
Wim Pruiksma

8

มีเว็บ API ฟรีที่แก้ปัญหานี้ได้อย่างแท้จริงเรียกว่าonwater.io onwater.ioไม่ใช่สิ่งที่สร้างขึ้นใน Google แผนที่ แต่เมื่อกำหนดละติจูดและลองจิจูดมันจะส่งคืนจริงหรือเท็จผ่านคำขอรับ

ตัวอย่างบนน้ำ: 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ซึ่งเป็น บริษัท ที่อยู่เบื้องหลัง onwater เราสร้างบนน้ำเพื่อแก้ปัญหานี้ด้วยตัวเองและช่วยเหลือชุมชน ใช้งานได้ฟรี (จ่ายสำหรับปริมาณมาก) และเราต้องการแบ่งปัน :)


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

ฉันคิดว่าการทำแบบสอบถามนี้ในพื้นที่น่าสนใจกว่าดังนั้นฉันจึงสามารถพึ่งพาตนเองได้มากขึ้นสมมติว่าฉันต้องการสร้างพิกัดที่ดินแบบสุ่ม 25,000 พิกัดในคราวเดียวฉันอยากหลีกเลี่ยงการเรียก API ภายนอกที่อาจมีราคาแพง นี่คือช็อตของฉันใน python โดยใช้ตัวอย่าง python ที่กล่าวถึงโดย 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)

ฉันลองพิกัดโหลมันใช้งานได้ดีเยี่ยม คุณสามารถดาวน์โหลดไฟล์ "land_polygons.shp" ได้ที่นี่ซึ่งเป็นคำชมของ OpenStreetMaps (ฉันใช้ลิงค์ดาวน์โหลด WGS84 แรกด้วยตัวเองบางทีอันที่สองก็ใช้ได้เช่นกัน)


แล้วทะเลสาบล่ะ? มันถือว่าจุดบนทะเลสาบเป็นทะเลหรือบนบก?
fatma.ekici

คำถามที่ดี! ฉันจะตรวจสอบในหน้าเว็บเพื่อข้อมูล OpenStreetMaps ที่ถูกเชื่อมโยงในคำตอบของฉันnatural=coastlineและมันบอกว่าไฟล์ที่ดินฐานค่าที่มีต่อแท็ก Googling ด่วนให้ใช้หน้านี้ซึ่งระบุโดยเฉพาะว่าแท็กชายฝั่งใช้ไม่ได้กับทะเลสาบในระบบการตั้งชื่อ ดังนั้นฉันจะบอกว่าไม่วิธีการของฉันไม่ได้ระบุว่าทะเลสาบเป็นน้ำเนื่องจากชุดข้อมูลที่ฉันใช้ไม่ได้ แต่ลองด้วยตัวคุณเอง!
SylvainB

7

ชำระเงินนี้บทความ ตรวจจับได้อย่างแม่นยำว่ามีสิ่งใดอยู่ในน้ำโดยไม่จำเป็นต้องใช้เซิร์ฟเวอร์ เป็นการแฮ็กที่อาศัยคุณลักษณะการจัดแต่งทรงผมที่กำหนดเองใน Google Maps


5

นอกเหนือจากการระบุพิกัดทางภูมิศาสตร์แบบย้อนกลับตามที่Dr 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 และทรัพยากรที่อ้างอิงนั้นไม่ฟรี แต่มีบริการเว็บที่ให้บริการโดย DynamicGeometry ซึ่งแสดงการดำเนินการGetWaterOrLandที่ยอมรับคู่ละติจูด / ลองจิจูด ( คุณสามารถดูการสาธิตได้ที่นี่ )

ความเข้าใจของฉันเกี่ยวกับวิธีการใช้งานคือการใช้ไฟล์รูปร่างของน้ำ ไฟล์รูปร่างเหล่านี้ใช้กับ 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");
    }
});


2

ฉันอยากจะแนะนำให้คุณกลิ้งเองที่นี่ คุณสามารถใช้เครื่องมือเช่นGDALเพื่อสืบค้นเนื้อหาภายใต้จุดใน shapefile คุณสามารถรับ shapefiles สำหรับภูมิศาสตร์ของสหรัฐอเมริกาได้จากหลายแหล่งรวมทั้งUS Census Bureauสำนักสำมะโนประชากรสหรัฐ

ซึ่งสามารถทำได้ผ่านไบนารี GDAL, ซอร์ส C หรือผ่าน swig ใน Java, Python และอื่น ๆ

แผนที่สำมะโนประชากร

ข้อมูล GDAL

Point Query ตัวอย่างใน Python


1

นี่คือวิธีง่ายๆ

เนื่องจาก Google ไม่ได้ให้ผลลัพธ์ที่เชื่อถือได้เกี่ยวกับพิกัดที่อยู่ในมหาสมุทรหรือแหล่งน้ำในทะเลคุณจึงต้องใช้บริการสำรองอื่นเช่นยานเดกซ์เพื่อช่วยให้ข้อมูลสำคัญนั้นเมื่อข้อมูลสูญหาย คุณน่าจะไม่ต้องการใช้ยานเดกซ์เป็น geocoder หลักของคุณเนื่องจาก Google เหนือกว่าในด้านความน่าเชื่อถือและความสมบูรณ์ของข้อมูลโลกอย่างไรก็ตามยานเดกซ์มีประโยชน์มากสำหรับวัตถุประสงค์ในการดึงข้อมูลเมื่อเกี่ยวข้องกับการประสานงานกับแหล่งน้ำ ดังนั้นใช้ทั้งสองอย่าง


เอกสารยานเดกซ์: https://api.yandex.com.tr/maps/doc/geocoder/desc/concepts/input_params.xml


ขั้นตอนในการดึงชื่อมหาสมุทร:

1. ) ใช้ Google ก่อนเพื่อย้อนกลับพิกัดพิกัดทางภูมิศาสตร์

2. ) หาก Google ให้ผลลัพธ์เป็นศูนย์มีโอกาส 99% ที่พิกัดจะอยู่เหนือมหาสมุทร ตอนนี้สร้างคำขอ geocoding ย้อนกลับรองที่มีพิกัดเดียวกันกับ Yandex ยานเดกซ์จะส่งคืนการตอบกลับ JSON พร้อมกับพิกัดที่แน่นอนภายในคำตอบนี้จะมีคู่ความสำคัญสองคู่ "คีย์": "ค่า"

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

and

["GeoObject"]["name"]

ตรวจสอบรหัสหาก == "พลังน้ำ" คุณรู้ว่าคุณอยู่เหนือแหล่งน้ำและเนื่องจาก 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 และตรวจสอบเพื่อดูค่าของคีย์ "ชนิด" หากเป็น คือ "พลังน้ำ" จากนั้นคุณจะรู้ว่าพิกัดอยู่บนน้ำ เนื่องจาก Google ส่งคืนผลลัพธ์ที่ตรงข้ามกับตัวอย่างข้างต้นจึงมีความเป็นไปได้ 99.99% ว่านี่เป็นแหล่งน้ำในประเทศดังนั้นตอนนี้คุณจึงได้ชื่อ หาก "kind" ไม่ == "hydro" ให้ใช้วัตถุที่ระบุพิกัดทางภูมิศาสตร์ของ Google

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

and

["GeoObject"]["name"]

นี่คือรหัสเดียวกันที่เขียนด้วย Ruby เพื่อรับ inland_body_of_water

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

หมายเหตุเกี่ยวกับการออกใบอนุญาต: เท่าที่ฉันทราบ Google ไม่อนุญาตให้คุณใช้ข้อมูลเพื่อแสดงบนแผนที่อื่น ๆ นอกเหนือจากข้อเสนอของ Google อย่างไรก็ตามยานเดกซ์มีการออกใบอนุญาตที่ยืดหยุ่นมากและคุณสามารถใช้ข้อมูลของพวกเขาเพื่อแสดงบนแผนที่ Google

นอกจากนี้ยานเดกซ์ยังมีข้อ จำกัด อัตราสูง 50,000 คำขอ / วันโดยไม่เสียค่าใช้จ่ายและไม่มีคีย์ API ที่จำเป็น


1

ฉันสามารถเข้าใกล้ได้โดยใช้ Google Elevation API นี่คือภาพของผลลัพธ์:

ภาพหน้าจอของผลลัพธ์

คุณเห็นรูปหกเหลี่ยมอยู่บนบกได้ดีแม้ว่าจะมีการกำหนดเส้นรอบวงรูปสี่เหลี่ยมผืนผ้าซึ่งบางส่วนอยู่เหนือน้ำ ในกรณีนี้ฉันได้ตรวจสอบอย่างรวดเร็วจาก Google Maps และระดับความสูงขั้นต่ำบนบกคือประมาณ 8-9 เมตรนั่นคือเกณฑ์ของฉัน รหัสส่วนใหญ่คัดลอก / วางจากเอกสารของ Google และ Stack Overflow นี่คือส่วนสำคัญทั้งหมด:

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


เฉพาะ FYI เอกสาร Google Elevation API มีอยู่ที่นี่: developers.google.com/maps/documentation/javascript/elevation
dvas0004

2
นี่คือตัวอย่างที่ดีของการใช้งานที่เป็นไปได้ แต่มันจะล้มเหลวอย่างรุ่งโรจน์ในแหล่งน้ำที่ขังบนบก (Lago di garda - อิตาลีในตัวอย่างภาพที่เชื่อมโยง) รหัสที่ดีมากที่คิดว่าจะใช้เป็นพื้นฐานสำหรับวิธีแก้ปัญหาอื่น!
Obmerk Kronen

1

หากที่List<Address>อยู่ส่งกลับเป็น 0 คุณสามารถสมมติว่าตำแหน่งนี้เป็นมหาสมุทรหรือทรัพยากรธรรมชาติได้เพียงเพิ่มโค้ดด้านล่างในวิธีการตอบกลับของคุณในการตอบสนองของ Google Places 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 ฉันไม่สามารถรับโซลูชันของ SylvainB เพื่อทำงานร่วมกับสคริปต์ python ที่ตรวจสอบว่าพิกัดอยู่บนบกหรือไม่ อย่างไรก็ตามฉันสามารถหาได้โดยดาวน์โหลด 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 แต่ฉันฝันร้ายในการพยายามรับแพ็คเกจทั้งหมดที่คุณต้องติดตั้งจนติดอยู่กับ python


-3

ฉันมีทางออกอื่นที่นี่ ในการใช้งานแผนที่ Google ในปัจจุบันจะไม่คำนวณทิศทาง / ระยะทางจากตำแหน่งน้ำไปยังตำแหน่งบนบกและในทางกลับกัน ทำไมเราไม่ใช้ตรรกะนี้ในการพิจารณาว่าจุดนั้นคือที่ดินหรือน้ำ

ตัวอย่างเช่นลองใช้ตัวอย่างนี้

หากเราต้องการตรวจสอบว่าจุดxนั้นเป็นที่ดินหรือน้ำ

ให้เราตรวจสอบทิศทางระหว่างจุดxและจุดที่ทราบyซึ่งเป็นที่ดิน หากกำหนดทิศทาง / ระยะทางแล้วชี้xเป็นที่ดินหรือมิฉะนั้นก็คือน้ำ


คุณได้ลองทำจริงหรือเพียงแค่สมมติว่า "ปรุงอาหารจากน้ำ"?
TMS

และคุณคิดว่าจะจัดการสะพานอย่างไร? หรืออุโมงค์?
Obmerk Kronen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.