Yritän georeferoida joukkoa Google Maps -sivustolta ladattuja kuvaruutuja. Vain kunkin kuvan perusteella ”Google Maps -verkkoviite ja zoomaustaso, kuinka voin laskea reaalimaailman koordinaatit?

Sivu http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection näyttää koordinaatit ja Google Maps -verkkoviittauksen web-merkkilaatoille.

Esimerkiksi keskiruutu on x=49, y=30, z=6 ja siinä on kulmakoordinaatit 10644926.307106785, 626172.1357121654, 11271098.44281895, 1252344.27142432:

kirjoita kuvan kuvaus tähän

Voiko kulmakoordinaatit laskea yksinomaan ruudukon viitteen ja zoomaustason (49, 30, 6) perusteella?

Tämä on samanlainen kuin Kuinka määritellä web-Mercator-ruutu oikein gdalilla? , mutta tarvitsen täysin ohjelmallisen ratkaisun tarvitsematta etsiä mitään verkossa. (Tai jos minun on etsittävä arvoja verkosta, sen on oltava ohjelmallista).

Muokkaa: tämä kuvakaappaus näyttää esimerkkiruudun sijainnin (zoomaustaso 11, x = 1593, y = 933) . Kuinka georeferenssin kyseistä ruutua?

kirjoita kuvan kuvaus tähän

Kommentit

  • Tuleeko se todellisena ruutuna? Ei ympäröivää?
  • @FelixIP joo, tiedän vain kunkin JPG: n ruudukko- ja zoomaustason. Olen ’ lisännyt kuvakaappauksen tämän osoittamiseksi. PS Ymmärrän, että tämä on hieman hölmö, mutta joskus se on tehtävä – plus ’ on mielenkiintoinen harjoitus!
  • mielestäni sinun pitäisi pystyä saamaan kulmakoordinaatit, jotka käyttävät vain zoomaustasoja ja ruudukon viitteitä, tietojeni mukaan ruudukon referenssijärjestelmä pysyy vakiona, joten siihen pitäisi olla tapa. Koska zoomaustasolla 0 on maailma 1 ruudussa ja zoomaus 1 4: ssä ja niin edelleen, koordinaattien pitäisi olla mahdollista saada.
  • @StephenLead ehkä yrittää jakaa maailman 4 osaan kussakin zoomauksessa ( iteraatio) ja hanki koordinaatit jollain tavalla. ’ Ll on oltava iteratiivinen funktio ymmärrykseni mukaan.
  • saitko tehdä tämän? eli sallivatko Google Mapsin termit tämän?

Vastaa

Tämä sivu http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection tarjoaa pythonilla kirjoitetut algoritmit laskemaan ruuturajat EPSG: 900913 -koordinaateissa ja leveysaste / pituusaste käyttämällä WGS84-peruspistettä.

Tämän komentosarjan luokka GlobalMercator http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection / globalmaptiles .py sisältää kaksi tapaa, TileBounds() ja TileLatLonBounds().

Komentosarjan muokattu versio ruudun rajakoordinaattien näyttämiseksi:

 #!/usr/bin/env python ############################################################################### # $Id$ # # Project: GDAL2Tiles, Google Summer of Code 2007 & 2008 # Global Map Tiles Classes # Purpose: Convert a raster into TMS tiles, create KML SuperOverlay EPSG:4326, # generate a simple HTML viewers based on Google Maps and OpenLayers # Author: Klokan Petr Pridal, klokan at klokan dot cz # Web: http://www.klokan.cz/projects/gdal2tiles/ # ############################################################################### # Copyright (c) 2008 Klokan Petr Pridal. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### """ tilebounds.py Adapted from: http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection/globalmaptiles.py Global Map Tiles as defined in Tile Map Service (TMS) Profiles ============================================================== Functions necessary for generation of global tiles used on the web. It contains classes implementing coordinate conversions for: - GlobalMercator (based on EPSG:900913 = EPSG:3785) for Google Maps, Yahoo Maps, Microsoft Maps compatible tiles - GlobalGeodetic (based on EPSG:4326) for OpenLayers Base Map and Google Earth compatible tiles More info at: http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification http://wiki.osgeo.org/wiki/WMS_Tiling_Client_Recommendation http://msdn.microsoft.com/en-us/library/bb259689.aspx http://code.google.com/apis/maps/documentation/overlays.html#Google_Maps_Coordinates Created by Klokan Petr Pridal on 2008-07-03. Google Summer of Code 2008, project GDAL2Tiles for OSGEO. In case you use this class in your product, translate it to another language or find it usefull for your project please let me know. My email: klokan at klokan dot cz. I would like to know where it was used. Class is available under the open-source GDAL license (www.gdal.org). """ import math class GlobalMercatorLight(object): def __init__(self, tileSize=256): "Initialize the TMS Global Mercator pyramid" self.tileSize = tileSize self.initialResolution = 2 * math.pi * 6378137 / self.tileSize # 156543.03392804062 for tileSize 256 pixels self.originShift = 2 * math.pi * 6378137 / 2.0 # 20037508.342789244 def MetersToLatLon(self, mx, my ): "Converts XY point from Spherical Mercator EPSG:900913 to lat/lon in WGS84 Datum" lon = (mx / self.originShift) * 180.0 lat = (my / self.originShift) * 180.0 lat = 180 / math.pi * (2 * math.atan( math.exp( lat * math.pi / 180.0)) - math.pi / 2.0) return lat, lon def PixelsToMeters(self, px, py, zoom): "Converts pixel coordinates in given zoom level of pyramid to EPSG:900913" res = self.Resolution( zoom ) mx = px * res - self.originShift my = py * res - self.originShift return mx, my def TileBounds(self, tx, ty, zoom): "Returns bounds of the given tile in EPSG:900913 coordinates" minx, miny = self.PixelsToMeters( tx*self.tileSize, ty*self.tileSize, zoom ) maxx, maxy = self.PixelsToMeters( (tx+1)*self.tileSize, (ty+1)*self.tileSize, zoom ) return ( minx, miny, maxx, maxy ) def TileLatLonBounds(self, tx, ty, zoom ): "Returns bounds of the given tile in latutude/longitude using WGS84 datum" bounds = self.TileBounds( tx, ty, zoom) minLat, minLon = self.MetersToLatLon(bounds[0], bounds[1]) maxLat, maxLon = self.MetersToLatLon(bounds[2], bounds[3]) return ( minLat, minLon, maxLat, maxLon ) def Resolution(self, zoom ): "Resolution (meters/pixel) for given zoom level (measured at Equator)" # return (2 * math.pi * 6378137) / (self.tileSize * 2**zoom) return self.initialResolution / (2**zoom) #--------------------- if __name__ == "__main__": import sys, os def Usage(s = ""): print "Usage: tilebounds.py tx ty zoomlevel" print sys.exit(1) profile = "mercator" zoomlevel = None tx, ty = None, None argv = sys.argv i = 1 while i < len(argv): arg = argv[i] if tx is None: tx = float(argv[i]) elif ty is None: ty = float(argv[i]) elif zoomlevel is None: zoomlevel = int(argv[i]) else: Usage("ERROR: Too many parameters") i = i + 1 if profile != "mercator": Usage("ERROR: Sorry, given profile is not implemented yet.") if zoomlevel == None or tx == None or ty == None: Usage("ERROR: Specify at least "lat", "lon" and "zoomlevel".") tz = zoomlevel mercator = GlobalMercatorLight() minx, miny, maxx, maxy = mercator.TileBounds( tx, ty, tz ) print "Bounds of the given tile in EPSG:900913 coordinates: " print " upper-left corner: " print (minx, miny) print " bottom-right corner: " print (maxx, maxy) print minLat, minLon, maxLat, maxLon = mercator.TileLatLonBounds( tx, ty, tz ) print "Bounds of the given tile in latitude/longitude using WGS84 datum: " print " upper-left corner: " print (minLat, minLon) print " bottom-right corner: " print (maxLat, maxLon) print  

Käyttö: tilebounds xTile yTile zoom.

Esimerkiksi ruudun tulos x=49, y=30, z=6 on seuraava:

$./tilebounds.py 49 30 6 Bounds of the given tile in EPSG:900913 coordinates: upper-left corner: (10644926.307106785, -1252344.271424327) bottom-right corner: (11271098.44281895, -626172.1357121654) Bounds of the given tile in latitude/longitude using WGS84 datum: upper-left corner: (-11.178401873711772, 95.625) bottom-right corner: (-5.61598581915534, 101.25000000000001) 

Laatta voidaan ladata URL-osoitteella http://mt.google.com/vt?x=xTile&y=yTile&z=zoom, mutta tämä on on kielletty pääsy siihen suoraan.

Ohjelmiston on alun perin kirjoittanut Klokan Petr Přidal.

Toivon, että tämä voi auttaa!

Kommentit

  • Tervetuloa GIS-pino-pörssiin ja paljon kiitoksia tästä. Vaatimukseni on läpäissyt, koska ’ en enää toimi tällä projektilla, mutta näiden tietojen pitäisi toivottavasti osoittautua hyödyllisiksi jollekin muulle tulevaisuudessa

Vastaa

Heitä tämä vain osana keskustelua ruuduista, välimuistissa olevista ruuduista, georeferensseistä jne.

Minkälaatat Tiedän, että älä käytä XY-georeferointijärjestelmää sinänsä …

Esimerkiksi kun lataat ESRI-peruskartan QGIS-järjestelmään, se luo seuraavanlaisen ruudun stache-kansiorakenteen:

kirjoita kuvan kuvaus tähän

Kun katsot ylätason kuvia, sinulla on pyysi ruutuja, ja ne tallennetaan kyseisiin kansioihin.

Tässä on f / d-kansion sisältö:

kirjoita kuvan kuvaus tähän

Huomaa, että tiedostossa ei ole georeferointitietoja (maailmatiedosto jne.)

Kun tuot tämän tiedoston MS: ään esimerkiksi paint, voit käsitellä kuvaa ja tallentaa sen uudelleen:

kirjoita kuvan kuvaus tähän

…joten kun tarkastelet karttaa uudelleen QGIS: ssä, joka tekee ruudut, näet ”muokatun” ruutusi:

kirjoita kuvan kuvaus tähän

Joten luulen vain, että jos sinulla olisi joukko ruutuja google earthista, voit teoriassa luoda ruudun uudelleen rakenne ja laita ruudut yksinkertaisesti noihin kansioihin, ja ne piirtävät QGIS: ssä …

Se on itse ohjelmisto, joka tietää, mihin ruudut piirtää välimuistijärjestelmän ja kansiorakenteen perusteella … tämä palaa jälleen päiviin, jolloin opetin ArcGIS Server -kursseja.

Voit sitten viedä ne QGIS: stä georeferointitietojen avulla ja käyttää niitä muualla.

Mutta jälleen kerran, voit myös ladata Google Mapsin QGIS: ään ja viedä kuvan TIF-tiedostona maailman tiedostoon …

(Jälleen, ei oikeastaan vastaus, vain keskustelua …)

Kommentit

  • anteeksi myöhäisestä vastauksesta. Rehellisesti sanottuna en voi ’ edes muistaa, miksi kysyin tätä, koska projekti on jo ohi;) Muistan kuitenkin, että minun piti luoda uudelleen mitä tahansa ohjelmistoa tekemää voodooa se osaa sijoittaa kuvia kansiorakenteen perusteella

Vastaa

Tapasi tämän ongelman äskettäin, voit käyttää wiki.openstreetmap.org

tässä oleva Java-koodi:

 class BoundingBox { double north; double south; double east; double west; } BoundingBox tile2boundingBox(final int x, final int y, final int zoom) { BoundingBox bb = new BoundingBox(); bb.north = tile2lat(y, zoom); bb.south = tile2lat(y + 1, zoom); bb.west = tile2lon(x, zoom); bb.east = tile2lon(x + 1, zoom); return bb; } static double tile2lon(int x, int z) { return x / Math.pow(2.0, z) * 360.0 - 180; } static double tile2lat(int y, int z) { double n = Math.PI - (2.0 * Math.PI * y) / Math.pow(2.0, z); return Math.toDegrees(Math.atan(Math.sinh(n))); } 

Vastaus

Katso matemaattinen lähestymistapa vastauksestani asiaan liittyvään kysymykseen täällä: rajoituslaatikon laskeminen tunnetusta keskikoordinaatista ja zoomauksesta

Sinun on pystyttävä muuntamaan ruudun koordinaatit ja pikselit pikselikoordinaateiksi, mutta” ei liian kovaa.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *