[PYTHON] Trouvez un bâtiment de la même hauteur que Shin Godzilla sur Google Earth

Shin Godzilla est incroyablement puissant. Il semble qu'il y ait aussi 118,5 m. D'un autre côté, à Tokyo, où les immeubles de grande hauteur sont alignés, il y a beaucoup de bâtiments qui sont plus hauts que cela. Il semble que Tokyo Midtown mesure 248 m de long et Shingodzilla ne fait plus la moitié de la taille.

Shingodzilla est-il vraiment grand ou petit? Je ne suis pas sûr de ce que c'est, alors j'ai utilisé l'API Google Earth et Selenium pour rechercher un bâtiment de la même hauteur dans les 23 quartiers de Tokyo afin de me faire une idée de sa taille.

Google Earth

midtown.png

L'image ci-dessus est lorsque le curseur est placé sur Tokyo Midtown sur Google Earth. En bas, l'altitude (269m) est affichée en plus de la latitude et de la longitude, et la hauteur du bâtiment est obtenue en soustrayant l'altitude au niveau de la mer de celle-ci. Google Earth utilise une technique appelée photographie aérienne pour déterminer l'altitude des bâtiments dans le monde.

Google Earth n'a pas d'API Web, mais il fournit une API Javascript qui vous permet d'obtenir des informations sur cet emplacement via un événement. Cette API est actuellement dépréciée et sera abandonnée à la fin de 2016, de sorte que ceux qui utilisent les données voudront peut-être l'acquérir tôt. Il n'y a pas de données ouvertes pour construire des informations d'altitude, et je pense qu'il est difficile de les obtenir en dehors de Google Earth.

Obtenez l'altitude du point cliqué avec l'API Javascript

Tout d'abord, utilisez l'API Javascript pour afficher Google Earth dans le navigateur afin que vous puissiez obtenir les informations de ce point en cliquant dessus. Cette fois, si vous spécifiez la latitude et la longitude dans le paramètre de requête comme `` / chemin / vers / index.html? Lat = 35.820 & lon = 139.555 '', une carte de 5 km x 5 km avec ce point en haut à gauche s'affiche. J'ai essayé de le faire. Comme il est placé sur 1 000 px x 1 000 px, c'est 5 m par 1 px.

index.html


<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Google Earth API</title>
    <style>
      body { width: 1000px; height: 1000px; margin: 0; }
      #map3d { height: 100%; }
    </style>
  </head>
  <body>
    <div id="map3d" />
    <script src="https://www.google.com/jsapi"></script>
    <script src="map.js"></script>
  </body>
</html>

map.js


google.load('earth', '1', { other_params: 'sensor=false' })

const results = []

google.setOnLoadCallback(() => {
  google.earth.createInstance('map3d', earth => {
    earth.getWindow().setVisibility(true)
    earth.getLayerRoot().enableLayerById(earth.LAYER_BUILDINGS, true)

    //analyse de chaîne de requête e.g., /path/to/index.html?lat=35.820&lon=139.555
    const params = location.search.split('?')[1].split('&')
    const [lat, lng] = params.map(param => parseFloat(param.split('=')[1]))
    
    const globe = earth.getGlobe()
    const lookAt = earth.createLookAt('')

    //Plage d'affichage de l'écran(m)
    lookAt.setRange(5000)

    // lat,Correction du lng à être situé en haut à gauche de l'écran(Centrer par défaut)
    lookAt.setLatitude(lat - 0.025844962203145)
    lookAt.setLongitude(lng + 0.03188911376511783)

    earth.getView().setAbstractView(lookAt)

    //Définir l'événement de clic
    google.earth.addEventListener(globe, 'click', event => {
      const info = {
        latitude: event.getLatitude(),
        longitude: event.getLongitude(),
        altitude: event.getAltitude()  //Altitude
      }
      info.groundAltitude = globe.getGroundAltitude(info.latitude, info.longitude)  //Altitude au niveau de la mer
      console.log(info)
      results.push(info)
    })
  }, () => {
    console.error('fail!')
  })
})

Si vous installez le plug-in Google Earth sur votre navigateur et que vous l'affichez, une carte commençant par la latitude et la longitude spécifiées sera affichée comme indiqué dans la figure ci-dessous. De plus, si vous cliquez quelque part sur la carte, vous pouvez voir que les informations de ce point sont envoyées à la console.

スクリーンショット 2016-08-21 0.30.27.png

Selenium automatise les événements de clic

Maintenant que vous pouvez obtenir les informations en cliquant, faisons apparaître Selenium de 1px. Dans ce cas, l'altitude sera acquise tous les 5 m, et comme elle est de 1 000 px x 1 000 px, elle sera de 1 million de clics.

getAltitude.py


#!/usr/bin/env python
# -*- coding:utf-8 -*-

from selenium import webdriver
import argparse
import time

def main():
    url = parse_args()
    browser = webdriver.Firefox()
    browser.get(url)
    map_element = browser.find_element_by_id('map3d')

    time.sleep(20)  # Allow google earth plugin while this time

    for x in xrange(1000):
        for y in xrange(1000):
            print x, y
            action = webdriver.common.action_chains.ActionChains(browser)
            action.move_to_element_with_offset(map_element, x, y).click().perform()
        results = browser.execute_script("return results;")
        with open('{}.csv'.format(url.split('?')[1]), 'a') as f:
            for d in results:
                f.write('{latitude},{longitude},{altitude},{groundAltitude}\n'.format(**d))
        browser.execute_script("results = [];")

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('-u', '--url', type=str, required=True, help='url path')
    args = parser.parse_args()
    return args.url

if __name__ == '__main__':
    main()

Si vous exécutez ce qui suit, Firefox démarrera et Selenium commencera à cliquer après 20 secondes. Veuillez autoriser le plug-in Google Earth dans ces 20 secondes. J'aimerais vraiment l'exécuter sur le serveur en utilisant un navigateur sans tête tel que PhantomJS, mais je ne pouvais pas y mettre le plug-in Google Earth, alors j'ai travaillé dur localement.

python getAltitude.py --url /path/to/index.html?lat=35.820\&lon=139.555

Lorsque l'exécution est terminée, le fichier csv suivant sera généré et les colonnes de latitude, longitude, altitude et niveau de la mer seront alignées sur 1 million de lignes.

35.8201681437,139.554803147,11.4957876807,11.4957887253
35.8201160743,139.55480317,11.495894997,11.4958948098
35.8200640214,139.554803208,11.4960015882,11.4960015454
35.8200119787,139.55480324,11.4961081794,11.4961079175
35.8199599214,139.554803282,11.4962147706,11.4962156907
...

Il a été constaté que les 23 quartiers de Tokyo pouvaient être couverts par 36 carrés de 5 km x 5 km (carrés de 30 km x 30 km), donc cette procédure a été effectuée dans chaque section pour obtenir un total de 36 millions d'informations ponctuelles (environ 2 Go).

23wards.png

Acquérir un bâtiment de la même hauteur que Shin Godzilla

Enfin, la latitude et la longitude du bâtiment à la même hauteur que Shingodzilla (118m à 119m) ont été obtenues à partir des données acquises.

In [1]: import csv

In [2]: for l in csv.reader(open('/path/to/csv')):
   ...:     if 118 < float(l[2]) - float(l[3]) < 119:
   ...:         print l[0], l[1]

Nous avons obtenu environ 1 000 lignes de sortie. Puisqu'ils sont cliqués à des intervalles de 5 m, beaucoup d'entre eux font apparaître le même bâtiment plusieurs fois, et le nombre de bâtiments est beaucoup plus petit que le nombre de lignes.

35.5497718126 139.67314824
35.5499246984 139.673900422
35.5498233084 139.673962201
35.549719274 139.676315323
35.5498629383 139.676696309
...

J'ai échantillonné les données acquises et vérifié certaines d'entre elles sur Google Map.

35.6704993 139.7551047:C'était un bâtiment de 29 étages à Hibiya appelé le bâtiment Togoku Seimei. Selon Wikipedia, la hauteur est de 120 m, donc à peu près la même hauteur que Shingodzilla.




#### **`35.6884934,139.6947538:C'était un bâtiment de 30 étages à Shinjuku appelé Monolith Building. 123 sur Wikipedia.Il était écrit 35 m, ce qui était un peu plus grand que Shingodzilla. De plus, Wikipedia a également la description suivante, et il semble qu'elle ait déjà été détruite par Godzilla.`**

Dans "Godzilla vs King Gidra" sorti en 1991, une scène détruite par Godzilla était représentée.

Je n'ai pas tardé à venir à Tokyo, et il y avait de nombreux bâtiments que je ne connaissais pas, donc les résultats n'ont pas vraiment approfondi mon image, mais je savais que c'était à peu près la même hauteur qu'un immeuble de 30 étages, et Shingodzilla a dit: "Un peu. J'ai trouvé que c'était énorme.

Recommended Posts

Trouvez un bâtiment de la même hauteur que Shin Godzilla sur Google Earth
Notez que GoogleMap.getProjection dans l'API Google Maps Android n'est pas un singleton
Programme pour rechercher la même image
Construire plusieurs environnements Python sur le même système
L'émulateur Linux "iSH" qui fonctionne sur iPad est un sujet brûlant en moi
Lorsqu'une variable locale portant le même nom que la variable globale est définie dans la fonction
Création d'un environnement TensorFlow qui utilise des GPU sous Windows 10
Trouvez la partie 575 de Wikipedia en Python
Y a-t-il un biais dans les nombres qui apparaissent dans les nombres de Fibonacci?
Utilisez l'écran LCD graphique comme un écran LCD de caractères pouvant également afficher des caractères chinois sur le Rasberry Pi