[PYTHON] Suchen Sie in Google Earth nach einem Gebäude, das der Höhe von Shin Godzilla entspricht

Shin Godzilla ist unglaublich mächtig. Es scheint, dass es auch 118,5 m gibt. Auf der anderen Seite gibt es in Tokio, wo Hochhäuser aneinandergereiht sind, viele Gebäude, die höher sind. Es scheint, dass Tokyo Midtown 248 m lang ist und Shingodzilla nicht mehr halb so groß ist.

Ist Shingodzilla wirklich groß oder klein? Ich bin mir nicht sicher, was es ist, also habe ich Google Earth API und Selenium verwendet, um in den 23 Bezirken Tokios nach einem Gebäude gleicher Höhe zu suchen, um eine Vorstellung davon zu bekommen, wie groß es ist.

Google Earth

midtown.png

Das Bild oben ist, wenn der Cursor auf Tokyo Midtown in Google Earth platziert wird. Unten wird zusätzlich zum Breiten- und Längengrad die Höhe (269 m) angezeigt, und die Höhe des Gebäudes wird durch Subtrahieren der Meeresspiegelhöhe ermittelt. Google Earth verwendet eine Technik namens Luftbildfotografie, um die Höhe von Gebäuden auf der ganzen Welt zu bestimmen.

Google Earth verfügt nicht über eine Web-API, bietet jedoch eine Javascript-API, mit der Sie über ein Ereignis Informationen zu diesem Standort abrufen können. Diese API ist derzeit nicht verfügbar und wird Ende 2016 eingestellt. Daher möchten diejenigen, die die Daten verwenden, sie möglicherweise frühzeitig abrufen. Es gibt keine offenen Daten zum Erstellen von Höheninformationen, und ich denke, es ist schwierig, diese außerhalb von Google Earth abzurufen.

Ermitteln Sie die Höhe des angeklickten Punkts mit der Javascript-API

Verwenden Sie zunächst die Javascript-API, um Google Earth im Browser anzuzeigen, damit Sie die Informationen zu diesem Punkt abrufen können, indem Sie darauf klicken. Wenn Sie diesmal im Abfrageparameter wie `` / path / to / index.html? Lat = 35.820 & lon = 139.555``` Breiten- und Längengrade angeben, wird eine Karte von 5 km x 5 km mit diesem Punkt oben links angezeigt. Ich habe es versucht. Da dies auf 1.000 x 1.000 Pixel platziert ist, beträgt es 5 m pro 1 Pixel.

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)

    //Abfragezeichenfolgenanalyse 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('')

    //Bildschirmanzeigebereich(m)
    lookAt.setRange(5000)

    // lat,Es wurde behoben, dass sich lng oben links auf dem Bildschirm befand(Standardmäßig zentrieren)
    lookAt.setLatitude(lat - 0.025844962203145)
    lookAt.setLongitude(lng + 0.03188911376511783)

    earth.getView().setAbstractView(lookAt)

    //Klickereignis festlegen
    google.earth.addEventListener(globe, 'click', event => {
      const info = {
        latitude: event.getLatitude(),
        longitude: event.getLongitude(),
        altitude: event.getAltitude()  //Höhe
      }
      info.groundAltitude = globe.getGroundAltitude(info.latitude, info.longitude)  //Meeresspiegelhöhe
      console.log(info)
      results.push(info)
    })
  }, () => {
    console.error('fail!')
  })
})

Wenn Sie das Google Earth-Plug-In in Ihrem Browser installieren und anzeigen, wird eine Karte angezeigt, die mit dem angegebenen Breiten- und Längengrad beginnt (siehe Abbildung unten). Wenn Sie irgendwo auf die Karte klicken, können Sie auch sehen, dass die Informationen dieses Punkts an die Konsole ausgegeben werden.

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

Selen automatisiert Klickereignisse

Nachdem Sie die Informationen durch Klicken erhalten haben, lassen Sie Selenium um 1 Pixel platzen. In diesem Fall wird die Höhe alle 5 m erfasst. Da sie 1.000 x 1.000 Pixel beträgt, beträgt sie 1 Million Klicks.

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()

Wenn Sie Folgendes ausführen, wird Firefox gestartet und Selenium beginnt nach 20 Sekunden zu klicken. Bitte erlauben Sie das Google Earth-Plug-In innerhalb dieser 20 Sekunden. Ich würde es wirklich gerne mit einem kopflosen Browser wie PhantomJS auf dem Server ausführen, aber ich konnte das Google Earth-Plug-In nicht in sie einfügen, also habe ich lokal hart gearbeitet.

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

Nach Abschluss der Ausführung wird die folgende CSV-Datei generiert und die Spalten für Breite, Länge, Höhe und Meeresspiegelhöhe in 1 Million Zeilen angeordnet.

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

Wir haben festgestellt, dass die 23 Bezirke von Tokio von 36 Quadraten von 5 km x 5 km (30 km x 30 km) abgedeckt werden können. Daher haben wir dieses Verfahren in jedem Abschnitt durchgeführt und insgesamt 36 Millionen Punktinformationen (ca. 2 GB) erhalten.

23wards.png

Erwerben Sie ein Gebäude, das genauso hoch ist wie Shin Godzilla

Schließlich wurde aus den erfassten Daten der Breiten- und Längengrad des Gebäudes auf derselben Höhe wie Shingodzilla (118 m bis 119 m) ermittelt.

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]

Wir haben ungefähr 1.000 Ausgabezeilen. Da sie in Abständen von 5 m angeklickt werden, platzen viele von ihnen mehrmals im selben Gebäude, und die Anzahl der Gebäude ist viel kleiner als die Anzahl der Reihen.

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

Ich habe die erfassten Daten abgetastet und einige davon auf Google Map überprüft.

35.6704993 139.7551047:Es war ein 29-stöckiges Gebäude in Hibiya, das Togoku Seimei-Gebäude. Laut Wikipedia beträgt die Höhe 120 m, also ungefähr die gleiche Höhe wie Shingodzilla.




#### **`35.6884934,139.6947538:Es war ein 30-stöckiges Gebäude in Shinjuku, das als Monolith-Gebäude bezeichnet wurde. 123 auf Wikipedia.Es wurde als 35m geschrieben, was etwas größer als Shingodzilla war. Darüber hinaus hat Wikipedia auch die folgende Beschreibung, und es scheint, dass es bereits von Godzilla zerstört wurde.`**

In "Godzilla vs King Gidra" aus dem Jahr 1991 wurde eine von Godzilla zerstörte Szene dargestellt.

Es war nur eine kurze Zeit, seit ich nach Tokio kam, und es gab viele Gebäude, von denen ich nichts wusste. Die Ergebnisse vertieften mein Image nicht wirklich, aber ich wusste, dass es ungefähr so hoch war wie ein 30-stöckiges Gebäude, und Shingodzilla sagte: "Etwas. Ich habe festgestellt, dass es riesig ist.

Recommended Posts

Suchen Sie in Google Earth nach einem Gebäude, das der Höhe von Shin Godzilla entspricht
Beachten Sie, dass GoogleMap.getProjection in der Android-API von Google Maps kein Singleton ist
Programm zur Suche nach demselben Bild
Erstellen mehrerer Python-Umgebungen auf demselben System
Der Linux-Emulator "iSH", der auf dem iPad läuft, ist ein heißes Thema in mir
Wenn eine lokale Variable mit demselben Namen wie die globale Variable in der Funktion definiert ist
Erstellen einer TensorFlow-Umgebung, die GPUs unter Windows 10 verwendet
Suchen Sie den Teil 575 aus Wikipedia in Python
Gibt es eine Verzerrung in den Zahlen, die in den Fibonacci-Zahlen erscheinen?
Verwenden Sie das Grafik-LCD als Zeichen-LCD, das auch chinesische Zeichen auf dem Rasberry Pi anzeigen kann