Xác minh xem một điểm là Đất hay Nước trong Google Maps


106

..và sau đó Google-maps "phân chia vùng nước với vùng nước"

Chà, không phải theo nghĩa Kinh thánh mà là ..

Tôi muốn biết mình có những lựa chọn nào để xác minh xem một điểm của [Vĩ độ, Kinh độ] là Đất hay Nước.

Google Maps rõ ràng có dữ liệu này (các vùng nước có màu xanh lam) - nhưng có thứ gì đó trong API mà tôi có thể sử dụng cho điều đó không? Và nếu không - họ không phục vụ nó bởi vì họ chưa bao giờ nghĩ đến nó? Hay vì nó quá phức tạp?

Tôi không tìm thấy bất kỳ thông tin nào về vấn đề này - ngoại trừ một số câu hỏi tương tự ở đây (như tìm loại địa hình hoặc độ cao - nhưng nó không phải là chính xác những gì tôi cần).

Có lớp tách biệt cho điều đó không? Một lựa chọn? Chỉ huy? Hay tôi nên làm điều đó theo cách thủ công?

Cách duy nhất mà tôi có thể nghĩ ra cách tiếp cận điều này (nếu tôi cần làm điều đó theo cách thủ công) là kiểm tra mọi ô được phân phối cho điểm chính xác - và sau đó kiểm tra giá trị RGB cho màu sắc của bản đồ Google đó. Đây chỉ là trên lý thuyết - vì trong thực tế - tôi không biết làm thế nào để đạt được điều đó, trở ngại đầu tiên là tôi không biết làm cách nào để chuyển đổi vị trí pixel trên ô xếp thành điểm [LatLon] chẳng hạn.

Một giải pháp được tạo sẵn sẽ dễ dàng hơn nhiều.

Lưu ý rằng tôi không cần TẤT CẢ nước trên thế giới (ví dụ - tôi không quan tâm đến suối, ao nhỏ, hầu hết các con sông hoặc bể bơi của hàng xóm của bạn. Tôi cần những điểm mà một người có thể mạo hiểm mà không cần sự hỗ trợ của phương tiện nổi )

CHỈNH SỬA TÔI

Sau khi đọc nhận xét: Phương pháp đo độ cao không đáng tin cậy, có quá nhiều nơi DƯỚI mực nước biển (bạn có thể xem danh sách 10 điểm "sâu nhất" tại đây http://geology.com/below-sea-level/ ) và ở đó có quá nhiều vùng nước bị khóa đất TRÊN mực nước biển (hồ). Phương pháp định vị địa lý ngược không đáng tin cậy vì nó sẽ trả về một thực thể Địa chính trị, như thành phố hoặc tiểu bang - hoặc ZERO nhiều lần. Tôi đã xem xét các giải pháp giả đó trước khi đặt câu hỏi - nhưng không ai trong số chúng thực sự trả lời được câu hỏi - những phương pháp đó tốt nhất là "đoán".


1
Bạn có thể sử dụng thư viện độ cao. Mặc dù điều đó không phải lúc nào cũng đúng, nhưng tôi tưởng tượng rằng hầu hết mọi thứ ở khu vực mực nước biển. Có một số trường hợp góc khá rõ ràng (Thung lũng chết CA, Hà Lan, hồ trên núi, v.v.) nhưng nó có thể hoạt động với một con số gần đúng.

cảm ơn, tôi đã nghĩ về điều đó - nhưng cũng giống như bạn chỉ ra - có quá nhiều điểm dưới mực nước biển trên trái đất - không bao gồm tất cả trong số họ là không phải là một giải pháp khả thi ..
Obmerk Kronen

@michael - không đề cập đến tất cả các thủy vực bị khóa chặt trên đất liền mà bạn đã đề cập .. (hồ, v.v.)
Obmerk Kronen

Có lẽ phù hợp hơn với GIS.SE? Bạn có thể di chuyển khi tiền thưởng kết thúc.
TMS

Như bạn đã nhận được câu trả lời, tôi không có gì để nói về điều đó .. Nhưng, nếu tìm kiếm dữ liệu về nước hoặc thông tin GIS, thì có một cuộc thảo luận riêng biệt đang diễn ra trên miền riêng của chúng tôi http://gis.stackexchange.com/ Tại đây , bạn sẽ tìm thấy nhiều thứ bạn có thể yêu cầu, bao gồm cả dữ liệu nước .. sẽ giúp bạn trong trường hợp .. (nếu cần ..) Bài cũ Tôi hy vọng điều này sẽ giúp ..
MarmiK

Câu trả lời:


55

Đây là 2 cách khác nhau, bạn có thể thử:

  • Bạn có thể sử dụng Mã hóa địa lý đảo ngược của Google Maps . Trong bộ kết quả, bạn có thể xác định xem đó có phải là nước hay không bằng cách kiểm tra types. Trong trường hợp vùng biển là loại natural_feature. Xem thêm tại liên kết này http://code.google.com/apis/maps/documentation/geocoding/#Types .

    Ngoài ra, bạn cần kiểm tra tên của các đối tượng địa lý, nếu chúng có chứa Sea, Lake, Oceanvà một số từ khác liên quan đến vùng biển để chính xác hơn. Ví dụ, các sa mạc cũng là natural_features.

    Ưu điểm - Tất cả quá trình phát hiện sẽ được thực hiện trên máy của khách hàng. Không cần tạo dịch vụ phía máy chủ riêng.

    Nhược điểm - Rất không chính xác và khả năng bạn sẽ nhận được "không" ở vùng biển là rất cao.

  • Bạn có thể phát hiện vùng nước / vùng đất theo pixel bằng cách sử dụng Google Static Maps . Nhưng với mục đích này, bạn cần tạo dịch vụ http.

    Đây là các bước mà dịch vụ của bạn phải thực hiện:

    1. Nhận latitude, longitudecurrent zoomtừ khách hàng.
    2. Gửi kinh http://maps.googleapis.com/maps/api/staticmap?center={độ vĩ ,độ thu phóng }&zoom={hiện tại`} & size = 1x1 & maptype = route & sensor = false request tới dịch vụ Bản đồ tĩnh của Google.
    3. Phát hiện màu của pixel của hình ảnh tĩnh 1x1.
    4. Trả lời một thông tin về phát hiện.

    Bạn không thể phát hiện màu của pixel ở phía máy khách. Có, bạn có thể tải hình ảnh tĩnh trên máy của khách hàng và vẽ hình ảnh trên canvasphần tử. Nhưng bạn không thể sử dụng getImageDatangữ cảnh của canvas để lấy màu của pixel. Điều này bị hạn chế bởi chính sách tên miền chéo.

    Prons - Phát hiện chính xác cao

    Nhược điểm - Sử dụng tài nguyên máy chủ riêng để phát hiện


2
Cảm ơn - Tôi đã kiểm tra nó - Tôi không biết rằng các loại đang biến Biển Hồ Đại dương và những thứ thích, và như bạn đã chỉ trong bản chỉnh sửa của mình - natural_feature cũng sẽ là núi, đảo và sa mạc .. Bạn có thể trỏ đến một tài liệu? ngoài ra - làm cách nào bạn có thể thực hiện mã hóa địa lý ngược cho những nơi không có địa chỉ? và hồ nước là một phần của một thực thể địa kinh tế thì sao? giống như một INSIDE hồ một thành phố hoặc hạn chế đô thị (ví dụ genevre) hoặc đơn giản là một điểm mà là bên trong một thành phố cảng .Tại thử nghiệm của tôi, tôi đã faild để làm như vậy ..
Obmerk Kronen

3
Đối với hầu hết các vùng nước trên thế giới, mã hóa địa lý ngược sẽ trả về "kết quả không", hãy xem công cụ mã hóa địa lý: gmaps-samples-v3.googlecode.com/svn/trunk/geocoder/… và nhấp vào một nơi nào đó bên trong đại dương.
Dr.Molle

@Tomas - không phải là tôi muốn trở nên vô nghĩa hoặc thiếu tôn trọng đối với những "người xếp chồng" đồng nghiệp - nhưng có thể nó không được bình chọn vì nó không hợp lệ / phương pháp chính xác?
Obmerk Kronen

3
Sử dụng Bản đồ tĩnh theo cách được đề xuất có thể sẽ vi phạm Điều khoản (10.1.1 (h)).
Andrew Leach

1
Đối với các phương pháp tĩnh Maps, bạn có thể làm điều đó với phong cách developers.google.com/maps/documentation/static-maps/... nhưng cũng có thể sử dụng bài viết Saurav liên kết.
miguev

19

Dường như không thể thực hiện được với bất kỳ dịch vụ hiện tại nào của Google.

Nhưng có những dịch vụ khác, chẳng hạn như dịch vụ Truy vấn JSON của Ko architects ! Bạn chỉ cần truy vấn dữ liệu trong URL và bạn nhận được phản hồi JSON / XML .

Yêu cầu mẫu: http://api.koctures.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

Bạn phải đăng ký và cung cấp khóa và số lớp đã chọn. Bạn có thể tìm kiếm tất cả kho lưu trữ các lớp có sẵn của họ . Hầu hết các lớp chỉ mang tính khu vực, nhưng bạn cũng có thể tìm thấy toàn cầu, như Đường bờ biển thế giới :

nhập mô tả hình ảnh ở đây

Khi bạn chọn một lớp, bạn nhấp vào tab "Dịch vụ", bạn sẽ nhận được URL yêu cầu mẫu. Tôi tin rằng bạn chỉ cần đăng ký và thế là xong!

Và bây giờ là tốt nhất:

Bạn có thể tải lên lớp của mình!

Nó không có sẵn ngay lập tức, hey phải xử lý nó bằng cách nào đó, nhưng nó sẽ hoạt động! Kho lưu trữ lớp thực sự trông giống như mọi người đã tải chúng lên khi họ cần.


cái này trông gần như hoàn hảo, tuy nhiên tôi không thấy bất kỳ bản đồ địa phương nào không thuộc Châu Đại Dương. Có bất kỳ lớp nào của Hoa Kỳ không?
HaloWebMaster

@HaloWebMaster lớp tôi đã đề cập là toàn cầu. Và bạn cũng có thể tìm kiếm các lớp theo khu vực.
TMS

@HaloWebMaster Tôi vừa nhận thấy bạn có thể tải lên lớp của riêng mình! Xem bản cập nhật của tôi.
TMS

Này, Tomas, tôi không biết liệu bạn có thực sự nhận được tiền thưởng hay không (vì tôi đã ngoại tuyến được một tuần) nhưng điều này thật tuyệt! Cảm ơn sự giúp đỡ của bạn, tôi sẽ không thể làm cho ứng dụng của mình hoạt động được. Cảm ơn! (Nếu bạn đã không nhận được tiền thưởng, tôi sẽ reaward nó, chỉ cần PM cho tôi)
HaloWebMaster

Này, bạn đã tiết kiệm cho tôi một tuần viết mã tùy chỉnh! Nó đáng giá!
HaloWebMaster

8

Đây là những gì tôi sử dụng và nó đang hoạt động không quá tệ ... bạn có thể cải thiện bài kiểm tra nếu bạn có nhiều cpu hơn để lãng phí bằng cách thêm pixel.

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; không hoạt động trên phiên bản mới. Phiên bản mới nên như thế này if ($ đỏ == 537 && $ xanh == 627 && $ xanh == 765)
Wim Pruiksma

8

Có một API web miễn phí giải quyết chính xác vấn đề này được gọi là onwater.io . Nó không phải là thứ được tích hợp sẵn trong bản đồ của Google, nhưng với vĩ độ và kinh độ, nó sẽ trả về chính xác true hoặc false thông qua một yêu cầu nhận.

Ví dụ về nước: https://api.onwater.io/api/v1/results/23.92323,-66.3

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

Ví dụ trên đất liền: https://api.onwater.io/api/v1/results/42.35,-71.1

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

Tiết lộ đầy đủ Tôi làm việc tại Dockwa.com , công ty đứng sau onwater. Chúng tôi xây dựng trên mặt nước để tự giải quyết vấn đề này và giúp đỡ cộng đồng. Nó được sử dụng miễn phí (trả phí cho số lượng lớn) và chúng tôi muốn chia sẻ :)


1
Các liên kết mẫu được cập nhật: Ví dụ về nước: api.onwater.io/api/v1/results/23.92323,-66.3 Ví dụ về đất: api.onwater.io/api/v1/results/42.35,-71.1
Christian K.

1
Nó không còn miễn phí nữa (đối với khối lượng lớn hơn), nhưng nếu nó hoạt động tốt, nó vẫn rất phải chăng!
Christian K.

Trang tài liệu báo lỗi. Tôi muốn kiểm tra xem có bất kỳ dữ liệu cụ thể về phạm vi bảo hiểm nào không? Ý tôi là bạn bao gồm những quốc gia nào?
nr5

Onwater.io có hoạt động đối với hồ và sông không? Nếu vậy, tôi có nhận được chỉ dẫn về loại không?
luksch

7

Tôi nghĩ sẽ thú vị hơn khi thực hiện truy vấn cục bộ này, vì vậy tôi có thể tự chủ hơn: giả sử tôi muốn tạo 25000 tọa độ đất ngẫu nhiên cùng một lúc, tôi muốn tránh các lệnh gọi tới các API bên ngoài có thể tốn kém. Đây là cảnh quay của tôi về vấn đề này trong python, bằng cách sử dụng ví dụ về python được TomSchober đề cập. Về cơ bản, nó tra cứu các tọa độ trên một tệp 350MB được tạo sẵn chứa tất cả các tọa độ đất và nếu các tọa độ tồn tại trong đó, nó sẽ in ra.

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)

Tôi đã thử một tá tọa độ, nó hoạt động tuyệt vời. Tệp "land_polygons.shp" có thể được tải xuống tại đây , lời khen ngợi của OpenStreetMaps. (Tôi đã tự mình sử dụng liên kết tải xuống WGS84 đầu tiên, có thể liên kết thứ hai cũng hoạt động)


Còn hồ nước thì sao? Nó coi các điểm trên hồ là biển hay đất liền?
fatma.ekici

Câu hỏi hay! Tôi đã kiểm tra trên trang với dữ liệu OpenStreetMaps được liên kết trong câu trả lời của tôi và nó nói rằng tệp đất đặt các giá trị của nó trên thẻ natural=coastline. Một googling nhanh chóng cho phép sử dụng trang này , trong đó nói rõ rằng thẻ đường bờ biển thực sự không áp dụng cho các hồ trong danh pháp của chúng. Vì vậy, tôi sẽ nói rằng không , phương pháp của tôi không xác định hồ là nước, vì tập dữ liệu tôi đang sử dụng không có. Nhưng hãy thử nó cho chính mình!
SylvainB

7

Kiểm tra bài viết này . Nó phát hiện chính xác nếu có thứ gì đó ở trên mặt nước mà không cần máy chủ. Đó là một bản hack dựa vào tính năng tạo kiểu tùy chỉnh trong Google Maps.


5

Ngoài mã hóa địa lý ngược - như Tiến sĩ Molle đã chỉ ra, nó có thể trả về ZERO_RESULTS - bạn có thể sử dụng dịch vụ Elevation. Nếu bạn không nhận được kết quả bằng cách mã hóa địa lý ngược, hãy lấy độ cao của vị trí. Nói chung, biển có số âm vì đáy biển nằm dưới mực nước biển. Có một ví dụ hoạt động đầy đủ về dịch vụ độ cao.

Hãy nhớ rằng vì Google không cung cấp thông tin này nên bất kỳ phương pháp nào khác chỉ là phỏng đoán và các phỏng đoán vốn dĩ không chính xác. Tuy nhiên, việc sử dụng giá trị typetrả về bằng mã hóa địa lý ngược hoặc độ cao nếu typekhông có sẵn, sẽ bao gồm hầu hết các trường hợp.


cảm ơn câu trả lời của bạn và liên kết ví dụ (BTW - nó không hoạt động trong Opera đối với tôi) - nhưng tôi thực sự không thể bỏ qua tất cả các khu vực là đất và âm và các thử nghiệm của tôi cho thấy TYPE không đáng tin cậy - và nhiều lần trả về một thực thể địa chính trị gần kề. phải có một số phương pháp chính xác hơn - "đoán" dường như không phải là cách tiếp cận đúng ở đây. Nếu TYPE là đáng tin cậy - Nó đã có giải pháp tốt nhất - nhưng nó không phải là ... và bạn đang bỏ qua tất cả các thủy vực đất bị khóa mà mực nước biển TRÊN ...
Obmerk Kronen

3

Phương pháp này hoàn toàn không đáng tin cậy. Trên thực tế, dữ liệu trả về sẽ hoàn toàn phụ thuộc vào phần nào của thế giới mà bạn đang làm việc. Ví dụ, tôi đang làm việc ở Pháp. Nếu tôi nhấp vào vùng biển ở bờ biển nước Pháp, Google sẽ trả về vị trí ĐẤT gần nhất mà nó có thể "đoán" được. Khi tôi yêu cầu thông tin từ Google cho cùng câu hỏi này, họ đã trả lời rằng họ không thể trả lại chính xác điểm được yêu cầu trên một khối nước.

Tôi biết không phải là một câu trả lời thỏa đáng. Điều này khá khó chịu, đặc biệt là đối với những người trong chúng ta, những người cung cấp cho người dùng khả năng nhấp vào bản đồ để xác định vị trí điểm đánh dấu.


1
Tôi đồng ý - các phương pháp được đề xuất bởi @ user1113426 và @Andrew Leach không thực sự là phương pháp. tốt hơn là nói với người dùng "không nhấp vào vùng màu xanh lam" :-) nhưng nghiêm túc - tôi rất ngạc nhiên khi google không muốn phát hành một hàm như vậy - ngay cả khi gần đúng - thì tốt hơn là "xấp xỉ" hiện đang tồn tại - giống như con trỏ của bạn - đôi khi "bám" đến một vị trí cách xa hàng trăm mét. Ngay cả phương pháp của tôi gợi ý là nhiều ccurate (quá xấu tôi không có ý tưởng làm thế nào để thực hiện điều này.)
Obmerk Kronen

3

Nếu vẫn thất bại, bạn luôn có thể thử kiểm tra độ cao tại điểm và khoảng cách nào đó - không nhiều thứ khác ngoài nước có xu hướng hoàn toàn bằng phẳng.


cảm ơn, đây là một ý tưởng hay, nhưng nó sẽ thất bại ngoạn mục trên mọi thác nước, hoặc hẻm núi sông ...
Obmerk Kronen

2

Rất tiếc, câu trả lời này không có trong API Google Maps và tài nguyên được tham chiếu không miễn phí, nhưng có một dịch vụ web được cung cấp bởi DynamicGeometry cho thấy một hoạt động GetWaterOrLandchấp nhận một cặp vĩ độ / kinh độ ( bạn có thể xem bản trình diễn tại đây ).

Sự hiểu biết của tôi về cách thực hiện điều này là bằng cách sử dụng các tệp hình dạng cơ thể nước. Cách chính xác các tệp hình dạng này được sử dụng với API Google Maps, nhưng bạn có thể có được một số thông tin chi tiết từ bản trình diễn được liên kết.

Hy vọng rằng sẽ giúp một cách nào đó.


2

Đây là một ví dụ khác trong JavaScript thuần túy: http://jsfiddle.net/eUwMf/

Như bạn có thể thấy, Ideia về cơ bản giống như rebe100x, lấy hình ảnh từ API bản đồ tĩnh của Google và đọc pixel đầu tiên:

$("#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

Tôi muốn khuyên bạn nên lăn bánh của riêng bạn ở đây. Bạn có thể sử dụng các công cụ như GDAL để truy vấn nội dung dưới một điểm trong tệp hình dạng. Bạn có thể lấy các cấu hình định dạng cho địa lý Hoa Kỳ từ nhiều nguồn bao gồm cả Cục Điều tra Dân số Hoa Kỳ .

Điều này có thể được thực hiện thông qua tệp nhị phân GDAL, mã nguồn C hoặc thông qua swig trong Java, Python, v.v.

Bản đồ điều tra dân số

Thông tin GDAL

Ví dụ về truy vấn điểm trong Python


1

Đây là một giải pháp đơn giản

Vì Google không cung cấp kết quả đáng tin cậy liên quan đến tọa độ nằm trên đại dương hoặc vùng nước trong đất liền, nên bạn cần sử dụng một dịch vụ sao lưu khác, chẳng hạn như Yandex, để giúp cung cấp thông tin quan trọng khi bị thiếu. Rất có thể bạn sẽ không muốn sử dụng Yandex làm bộ mã hóa địa lý chính của mình vì Google vượt trội hơn nhiều về độ tin cậy và tính đầy đủ của dữ liệu thế giới, tuy nhiên, Yandex có thể rất hữu ích cho mục đích truy xuất dữ liệu khi nó liên quan đến tọa độ trên các vùng nước, vì vậy hãy sử dụng cả hai.


Tài liệu Yandex: https://api.yandex.com.tr/maps/doc/geocoder/desc/concept/input_params.xml


Các bước để lấy tên Ocean:

1.) Sử dụng Google trước để đảo ngược tọa độ mã hóa địa lý.

2.) Nếu Google trả về kết quả bằng không, thì có khả năng 99% là tọa độ nằm trên đại dương. Bây giờ, hãy thực hiện một yêu cầu mã hóa địa lý ngược thứ cấp có cùng tọa độ tới Yandex. Yandex sẽ trả về phản hồi JSON với tọa độ chính xác, trong phản hồi này sẽ có hai cặp "khóa": "giá trị" có tầm quan trọng

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

and

["GeoObject"]["name"]

Kiểm tra khóa loại, nếu nó == "hydro", bạn biết bạn đang ở trên một vùng nước và vì Google không trả về kết quả nên 99,99% khả năng vùng nước này là đại dương. Tên của đại dương sẽ là khóa "tên" ở trên.

Đây là một ví dụ về cách tôi sử dụng chiến lược này được viết bằng Ruby

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

Các bước để lấy tên Vùng nước nội địa:

Đối với ví dụ này, giả sử tọa độ của chúng ta nằm trong một cái hồ ở đâu đó:

1.) Sử dụng Google trước để đảo ngược tọa độ mã hóa địa lý.

2.) Google rất có thể sẽ trả về một kết quả là địa chỉ mặc định nổi bật trên đất liền gần đó. Trong kết quả này, nó cung cấp tọa độ của địa chỉ mà nó trả về, tọa độ này sẽ không khớp với tọa độ bạn đã cung cấp. Đo khoảng cách giữa tọa độ bạn đã cung cấp và tọa độ được trả về cùng với kết quả, nếu nó khác biệt đáng kể (ví dụ: 100 thước Anh) thì hãy thực hiện yêu cầu sao lưu phụ với Yandex và kiểm tra xem giá trị của khóa "loại", nếu nó là "hydro" thì bạn biết tọa độ nằm trên mặt nước. Vì Google trả về một kết quả trái ngược với ví dụ trên, nên 99,99% khả năng đây là vùng nước trong đất liền, vì vậy bây giờ bạn có thể lấy tên. Nếu "kind" không == "hydro" thì hãy sử dụng đối tượng được mã hóa địa lý của Google.

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

and

["GeoObject"]["name"]

Đây là cùng một đoạn mã được viết bằng Ruby để lấy nội địa_body_of_water

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

Lưu ý về Cấp phép: Theo như tôi biết, Google không cho phép bạn sử dụng dữ liệu của họ để hiển thị trên bất kỳ bản đồ nào khác ngoài những bản đồ mà Google cung cấp. Tuy nhiên, Yandex có giấy phép rất linh hoạt và bạn có thể sử dụng dữ liệu của họ để hiển thị trên bản đồ của Google.

Ngoài ra, Yandex có giới hạn tỷ lệ cao là 50.000 yêu cầu / ngày miễn phí và không cần khóa API.


1

Tôi đã đến khá gần bằng cách sử dụng API Google Elevation. Đây là hình ảnh kết quả:

ảnh chụp màn hình kết quả

Bạn thấy các hình lục giác khá nhiều ở trên cạn mặc dù chu vi hình chữ nhật được xác định là một phần trên mặt nước. Trong trường hợp này, tôi đã kiểm tra nhanh từ chính Google Maps và độ cao tối thiểu trên đất liền là khoảng 8-9m nên đó là ngưỡng của tôi. Mã chủ yếu được sao chép / dán từ tài liệu của Google và Stack Overflow, đây là ý chính đầy đủ:

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


Chỉ cần FYI, tài liệu Google API nâng cao có thể được tìm thấy ở đây: developers.google.com/maps/documentation/javascript/elevation
dvas0004

2
đây là một ví dụ tuyệt vời về khả năng sử dụng. nhưng nó sẽ thất bại một cách vinh quang trên các vùng nước bị khóa chặt trên đất liền (Lago di garda - Ý trong ví dụ hình ảnh được liên kết). Mã rất đẹp được cho là được sử dụng làm cơ sở khả thi cho một giải pháp khác!
Obmerk Kronen

1

Nếu List<Address> địa chỉ trả về 0, bạn có thể coi vị trí này là đại dương hoặc Tài nguyên thiên nhiên. Chỉ cần thêm mã bên dưới trong câu trả lời của bạn Phương pháp phản hồi API Google địa điểm.

Khởi tạo Danh sách Dưới đây như đã đề cập

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

Là một người mới hoàn toàn làm quen với Python, tôi không thể nhận được giải pháp của SylvainB để làm việc với tập lệnh python kiểm tra xem tọa độ có trên đất liền hay không. Tuy nhiên, tôi đã tìm ra cách này bằng cách tải xuống OSGeo4W ( https://trac.osgeo.org/osgeo4w/ ) và sau đó cài đặt mọi thứ tôi cần pip, Ipython và kiểm tra xem tất cả các lần nhập được chỉ định đều ở đó. Tôi đã lưu mã sau dưới dạng tệp .py.

Mã để kiểm tra xem tọa độ có trên đất liền không

###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

Tôi đã cố gắng làm cho nó hoạt động trong R nhưng tôi đã gặp ác mộng khi cố gắng tải tất cả các gói bạn cần cài đặt nên bị kẹt vào python.


-3

Tôi có một giải pháp khác ở đây. Trong triển khai bản đồ google hiện tại, nó không tính toán hướng / khoảng cách từ vị trí nước đến vị trí đất và ngược lại. Tại sao chúng ta không sử dụng logic này để xác định xem điểm đó là đất hay nước.

Ví dụ, hãy lấy ví dụ này

nếu chúng ta muốn xác định, nếu một điểm xlà đất hoặc nước, thì

chúng ta hãy kiểm tra hướng giữa điểm xvà một điểm đã biết ylà đất. Nếu nó xác định hướng / khoảng cách thì điểm xlà đất hoặc nếu không thì là nước.


Bạn đã thực sự thử nó hay bạn chỉ giả định, "nấu từ nước"?
TMS

Và bạn giả sử như thế nào để xử lý các cây cầu? hoặc đường hầm?
Obmerk Kronen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.