112 votes

Vérifiez si un point est Terre ou Eau dans Google Maps

..et puis Google Maps "divise les eaux des eaux"

Eh bien, pas dans le sens biblique mais..

J'aimerais savoir quelles options j'ai pour vérifier si un point de [Lat, Lon] est Terre ou Eau.

Google Maps a évidemment ces données (les masses d'eau sont bleues) - mais y a-t-il quelque chose dans l'API que je peux utiliser pour cela ? Et sinon - est-ce qu'ils ne le fournissent pas parce qu'ils n'y ont jamais pensé ? Ou parce que c'est trop compliqué ?

Je n'ai trouvé aucune information à ce sujet - sauf quelques questions similaires ici (comme trouver le type de terrain, ou l'élévation - mais ce n'est pas exactement ce dont j'ai besoin).

Y a-t-il un calque séparé pour cela ? Une option ? Une commande ? Ou dois-je le faire manuellement ?

La seule façon à laquelle je pense d'aborder cela (si je dois le faire manuellement) est de vérifier chaque tuile servie pour le point exact - et puis vérifier la valeur RGB pour cette teinte de carte Google. Ce n'est que théorique - car en pratique - je n'ai aucune idée comment accomplir cela, le premier obstacle étant que je ne sais pas comment je peux convertir un emplacement de pixel sur une tuile en point [LatLon] par exemple

Une solution prête à l'emploi serait beaucoup plus facile.

Notez que je n'ai pas besoin de TOUTE l'eau dans le monde (par exemple - je me fiche des ruisseaux, des petits étangs, de la plupart des rivières ou de la piscine de votre voisin. J'ai besoin des points où une personne peut s'aventurer sans l'aide d'un véhicule flottant)

MODIFIER I

Après avoir lu les commentaires : La méthode de l'élévation n'est pas fiable, il y a trop d'endroits SOUS le niveau de la mer (vous pouvez voir une liste des 10 "plus profonds" ici http://geology.com/below-sea-level/ ) et il y a trop de masses d'eau isolées DU niveau de la mer (lacs). La méthode de géolocalisation inverse n'est pas fiable car elle renverra une entité géopolitique, comme une ville, ou un état - ou ZÉRO de nombreuses fois. J'ai déjà examiné ces pseudo-solutions avant de poser la question - mais aucune d'entre elles n'a réellement répondu à la question - ces méthodes sont de simples "devinettes" au mieux.

1 votes

Vous pourriez utiliser la bibliothèque d'élévation. Bien que cela ne soit pas toujours vrai, j'imagine que la plupart du temps, les choses au niveau de la mer sont de l'eau. Il existe quelques cas particuliers assez évidents (Death Valley en Californie, les Pays-Bas, les lacs en montagne, etc.) mais cela pourrait fonctionner pour une approximation approximative.

0 votes

Merci, j'y ai déjà pensé - mais comme vous l'avez souligné - il y a trop de points en dessous du niveau de la mer sur Terre - les exclure tous n'est pas une solution viable.

0 votes

@michael - sans oublier tous les plans d'eau enclavés que vous avez mentionnés .. (lacs, etc..)

55voto

Engineer Points 19343

Voici 2 façons différentes que vous pouvez essayer :

  • Vous pouvez utiliser Google Maps Reverse Geocoding. Dans le jeu de résultats, vous pouvez déterminer s'il s'agit d'eau en vérifiant les types. Dans le cas de l'eau, le type est natural_feature. Voir plus à ce lien http://code.google.com/apis/maps/documentation/geocoding/#Types.

    Vous devez également vérifier les noms des caractéristiques, s'ils contiennent Mer, Lac, Océan et d'autres mots liés à l'eau pour plus de précision. Par exemple, les déserts sont aussi des natural_features.

    Avantages - Tout le processus de détection sera effectué sur la machine du client. Pas besoin de créer son propre service côté serveur.

    Inconvénients - Très imprécis et les chances d'obtenir "aucun" pour les eaux sont très élevées.

  • Vous pouvez détecter les eaux/terres par pixels en utilisant Google Static Maps. Mais pour cela, vous devez créer un service http.

    Voici les étapes que votre service doit effectuer :

    1. Recevoir les latitude, longitude et le zoom actuel du client.
    2. Envoyer une requête http://maps.googleapis.com/maps/api/staticmap?center={latitude,longitude}&zoom={zoom actuel`}&size=1x1&maptype=roadmap&sensor=false à Google Static Map service.
    3. Détecter la couleur du pixel de l'image statique 1x1.
    4. Répondre avec une information sur la détection.

    Vous ne pouvez pas détecter la couleur des pixels côté client. Oui, vous pouvez charger une image statique sur la machine du client et dessiner l'image sur l'élément canvas. Mais vous ne pouvez pas utiliser getImageData du contexte du canvas pour obtenir la couleur du pixel. Cela est restreint par la politique de domaine croisé.

    Avantages - Détection hautement précise

    Inconvénients - Utilisation des ressources de son propre serveur pour la détection

2 votes

Merci - j'ai déjà vérifié - je ne savais pas que les types étaient en train de devenir Sea Lake Ocean et les likes, et comme vous l'avez souligné dans votre édition - natural_feature pourrait également être une montagne, une île et un désert .. Pourriez-vous peut-être pointer vers une documentation ? aussi - comment faire une géocodification inverse pour des lieux sans adresses ? et qu'en est-il d'un lac qui fait partie d'une entité géopolitique ? comme un lac À L'INTÉRIEUR des limites d'une ville ou d'une municipalité (par exemple Genève) ou simplement un point À L'INTÉRIEUR d'un port de ville. Dans mes essais, j'ai échoué à le faire.

3 votes

Pour la plupart de l'eau dans le monde, une géocodification inverse renverra "zéro résultat", consultez l'outil de géocodage : gmaps-samples-v3.googlecode.com/svn/trunk/geocoder/… et cliquez quelque part dans un océan.

0 votes

@Tomas - non pas que je veuille être ingrat ou irrespectueux envers mes collègues "stackers" - mais peut-être que ce n'est pas voté car la méthode n'est pas valide / précise ?

19voto

TMS Points 17522

Il ne semble pas possible avec aucun service Google actuel.

Mais il existe d'autres services, comme Koordinates Vector JSON Query service! Vous interrogez simplement les données dans l'URL, et vous obtenez une réponse JSON/XML en retour.

Exemple de requête : 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

Vous devez vous inscrire et fournir votre clé et le numéro de la couche sélectionnée. Vous pouvez rechercher toutes leurs répertoire de couches disponibles. La plupart des couches sont seulement régionales, mais vous pouvez également trouver des mondiale, comme le World Coastline:

entrer la description de l'image ici

Lorsque vous sélectionnez une couche, vous cliquez sur l'onglet "Services", vous obtenez l'URL de requête d'exemple. Je crois que vous devez simplement vous inscrire et c'est tout!

Et maintenant le meilleur :

Vous pouvez télécharger votre couche!

Ce n'est pas disponible immédiatement, ils doivent le traiter d'une certaine manière, mais ça devrait fonctionner! Le répertoire des couches semble en réalité comme si les gens les avaient téléchargées au fur et à mesure de leurs besoins.

0 votes

Cela semble presque parfait, cependant je ne vois pas de cartes locales qui ne sont pas de l'Océanie. Y a-t-il des couches des États-Unis ?

0 votes

@HaloWebMaster la couche que j'ai mentionnée est globale. Et vous pouvez également rechercher les couches par région.

0 votes

@HaloWebMaster Je viens de remarquer que vous pouvez télécharger votre propre couche! Voir ma mise à jour.

8voto

rebe100x Points 121

C'est ce que j'utilise et ça fonctionne pas trop mal... vous pouvez améliorer le test si vous avez plus de CPU à gaspiller en ajoutant des pixels.

function isItWatter($lat,$lng) {

    $GMAPStaticUrl = "https://maps.googleapis.com/maps/api/staticmap?center=".$lat.",".$lng."&size=40x40&maptype=roadmap&sensor=false&zoom=12&key=VOTRECLEAPI";  
    //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);

    // pour le débogage afin d'afficher l'image
    ob_start();
    imagepng($image);
    $contents =  ob_get_contents();
    ob_end_clean();
    echo "";

    // voici le test : je teste seulement 3 pixels (suffisant pour éviter les rivières...)
    $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;
}

0 votes

Le code ne fonctionne pas sur la nouvelle version. La nouvelle version devrait ressembler à ceci : if($red == 537 && $green == 627 && $blue == 765)

7voto

Saurav Points 1041

Découvrez cet article. Il détecte précisément si quelque chose est sur l'eau sans avoir besoin d'un serveur. C'est une astuce qui repose sur la fonctionnalité de style personnalisé dans Google Maps.

3voto

Steve Barnes Points 9505

Si tout le reste échoue, vous pouvez toujours essayer de vérifier l'élévation au point et sur une certaine distance - pas grand-chose d'autre que l'eau n'a tendance à être complètement plat.

0 votes

Merci, c'est une belle idée, mais elle échouerait spectaculairement à chaque cascade, ou un canyon de rivière...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X