https://giswiki.hsr.ch/api.php?action=feedcontributions&user=Das-g&feedformat=atom Geoinformation HSR - Benutzerbeiträge [de-ch] 2024-03-29T00:01:35Z Benutzerbeiträge MediaWiki 1.27.0 https://giswiki.hsr.ch/index.php?title=Web_Map_Tile_Service&diff=70271 Web Map Tile Service 2024-02-25T17:17:17Z <p>Das-g: /* Einbinden in QGIS */ Varianten als Unterabschnitte ausgezeichnet</p> <hr /> <div>Der [[OGC]]-Standard '''Web Map Tile Service (WMTS)''' ([http://www.opengeospatial.org/standards/wmts offizielle Website mit Versionen], [http://portal.opengeospatial.org/files/?artifact_id=35326 PDF v1.0.0]) ist eine von [[Web Map Tiling#Spezifikationen|mehreren Konventionen]] um Rasterkarten als (potenziell vor-berechnete &amp; vor-gerenderte) Kachelsammlung anzubieten.<br /> <br /> Siehe auch <br /> * [[Hintergrundkarten]] und [[Web Map Tiling]].<br /> * Wikipedia ([https://en.wikipedia.org/wiki/Web_Map_Tile_Service en]|[https://de.wikipedia.org/wiki/Web_Map_Tile_Service de]).<br /> * WMTS Tool &quot;Tiles à la Google Maps&quot; https://www.maptiler.com/google-maps-coordinates-tile-bounds-projection/#3/15.00/50.00<br /> <br /> == Verwendung ==<br /> <br /> === Einbinden auf SwissTopo-Webkarte ===<br /> <br /> # Gehe auf https://map.geo.admin.ch/<br /> # Unter &quot;Advanced Tools&quot; (de: &quot;Erweiterte Werkzeuge&quot;), klicke &quot;Import&quot; (de: &quot;Importieren&quot;)<br /> # Gib die URL zur &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt;-Datei an<br /> # Klicke &quot;Connect&quot; (de: &quot;Verbinden&quot;)&lt;br /&gt;Die Liste der verfügbaren Layer des WMTS wird angezeigt. Durch Hovern über dem jeweiligen Listeneintrag wird eine Vorschau im Hintergrund geladen.<br /> # Für jeden gewünschten Layer:<br /> ## Wähle (durch Anklicken) den gewünschten WMTS-Layer aus der angezeigten Liste<br /> ## Füll wahlweise das Feld &quot;Description&quot; (de: &quot;Beschreibung&quot; aus) '''(optional)'''<br /> ## Klicke &quot;Add Layer&quot; (de: &quot;Layer Hinzufügen&quot;)<br /> <br /> <br /> === Einbinden in QGIS ===<br /> <br /> ==== Variante QGIS Builtin (XYZ/TMS Tiles Driver) ====<br /> * Im QGIS Browser eine neue Verbindung (Connection) eines &quot;XYZ Tiles&quot; anlegen und dann &quot;Add Layer to Project&quot;.<br /> * Siehe https://felix.rohrba.ch/en/2017/easily-add-tilemap-layers-qgis/ <br /> <br /> ==== Variante mit GDAL Konfig.-Datei (XML) ====<br /> * Siehe [[Hintergrundkarten]], [[Web_Map_Tiling]].<br /> <br /> ==== Variante als WMTS Layer (OGC Standard, WMTSCapabilities.xml) ====<br /> # Menü &quot;Layer&quot; &gt; &quot;Add Layer&quot; &gt; &quot;Add WMS/WMTS Layer...&quot; oder &lt;kbd&gt;Ctrl&lt;/kbd&gt;-&lt;kbd&gt;Shift&lt;/kbd&gt;-&lt;kbd&gt;W&lt;/kbd&gt;<br /> # Button &quot;New&quot;<br /> # Feld &quot;Name&quot; beliebig ausfüllen<br /> # In Feld &quot;URL&quot; die URL zur &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt;-Datei angeben<br /> # Button &quot;OK&quot;<br /> # Button &quot;Connect&quot;&lt;br /&gt;Die Liste der verfügbaren Layer des WMTS wird angezeigt.<br /> # Für jeden gewünschten Layer:<br /> ## Wähle (durch Anklicken) den gewünschten WMTS-Layer aus der angezeigten Liste<br /> ## Klicke Button &quot;Add&quot;<br /> # Klicke Button &quot;Close&quot;<br /> <br /> == Begrenzungen ==<br /> <br /> {| class=&quot;wikitable&quot;<br /> |-<br /> ! Position im XML-Baum (XPath)<br /> ! begrenzt<br /> ! mittels<br /> ! Minimalbeispiel<br /> ! Maximalbeispiel<br /> |-<br /> | &lt;code&gt;//Layer/ows:BoundingBox&lt;/code&gt;<br /> |<br /> das '''dargestellte Datenset'''<br /> des Layers<br /> <br /> (informativ;<br /> Tiles können auch ausserhalb verfügbar sein, stellen dort aber keine Daten dar)<br /> | Koordinaten im CRS des Layers<br /> | &lt;pre&gt;<br /> &lt;ows:BoundingBox&gt;<br /> &lt;ows:LowerCorner&gt;420000 30000&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;900000 350000&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:BoundingBox&gt;<br /> &lt;/pre&gt;<br /> | &lt;pre&gt;<br /> &lt;ows:BoundingBox crs=&quot;urn:ogc:def:crs:EPSG:6.3:21781&quot; dimensions=&quot;2&quot;&gt;<br /> &lt;ows:LowerCorner&gt;420000.000000 30000.000000&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;900000.000000 350000.000000&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:BoundingBox&gt;<br /> &lt;/pre&gt;<br /> |-<br /> | &lt;code&gt;//Layer/WGS84BoundingBox&lt;/code&gt;<br /> |<br /> das '''dargestellte Datenset'''<br /> des Layers<br /> <br /> (informativ;<br /> Tiles können auch ausserhalb verfügbar sein, stellen dort aber keine Daten dar)<br /> | dezimalen WGS84-Koordinaten (lon-lat: Längengrad vor Breitengrad)<br /> | &lt;pre&gt;<br /> &lt;ows:WGS84BoundingBox&gt;<br /> &lt;ows:LowerCorner&gt;-180 -85.05112878&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;180 85.05112878&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:WGS84BoundingBox&gt;<br /> &lt;/pre&gt;<br /> | &lt;pre&gt;<br /> &lt;ows:WGS84BoundingBox crs=&quot;urn:ogc:def:crs:OGC:2:84&quot; dimensions=&quot;2&quot;&gt;<br /> &lt;ows:LowerCorner&gt;-180.0 -85.05112877980659237838&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;180.0 85.05112877980659237838&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:WGS84BoundingBox&gt;<br /> &lt;/pre&gt;<br /> |-<br /> | &lt;code&gt;//Layer/TileMatrixSetLink/TileMatrixSetLimits/TileMatrixLimits&lt;/code&gt;<br /> |<br /> die '''abrufbaren Tiles'''<br /> des Layers<br /> für diese TileMatrix innerhalb des verlinken TileMatrixSets<br /> <br /> (normativ;<br /> Anfrage ausserhalb sollte zu &lt;code&gt;TileOutOfRange&lt;/code&gt;-Exception bzw. HTTP-Status-Code &lt;code&gt;400&lt;/code&gt; &lt;code&gt;Bad Request&lt;/code&gt; führen)<br /> | Tile-Indices<br /> | &lt;!-- TODO: Minimalbeispiel --&gt;<br /> | &lt;!-- TODO: Maximalbeispiel --&gt;<br /> |-<br /> | &lt;code&gt;//TileMatrixSet/BoundingBox&lt;/code&gt;<br /> |<br /> den '''Definitionsbereich''' des TileMatrixSets<br /> und damit<br /> die '''potentiell abrufbaren Tiles'''<br /> aller aktuellen ''und künftigen'' Layers,<br /> die dieses Set verwenden<br /> | Koordinaten im CRS des TileMatrixSets<br /> | &lt;!-- TODO: Minimalbeispiel --&gt;<br /> | &lt;!-- TODO: Maximalbeispiel --&gt;<br /> |-<br /> |}<br /> <br /> == XYZ &amp;rarr; WMTS ==<br /> <br /> Hat man bereits einen nach XYZ-Konvention im Web verfügbaren Kachel-Satz, so lässt sich aus diesem ein (RESTful) WTMS machen, in dem man eine passende (statische) ServiceMetadata-XML-Datei &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt; serviert.<br /> <br /> === Beispiel ===<br /> <br /> Kacheln von osm.ch als WMTS Konfig.-Datei:<br /> https://gist.githubusercontent.com/das-g/882334b2844d5cdc7807eb9c12b8bccb/raw/WMTSCapabilities.xml<br /> <br /> === XML-Schema-Validierung für &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt; ===<br /> <br /> Siehe auch [https://stackoverflow.com/a/129401/674064 diese StackOverflow-Antwort bzgl. &quot;XML Schema (XSD) validation tool&quot;].<br /> <br /> ==== Mit &lt;code&gt;xmllint&lt;/code&gt; (libxml) ====<br /> <br /> (CLI-Tool, das bei libxml mitinstalliert wird, und somit auf Linux &amp; Mac meist bereits vorhanden ist.)<br /> <br /> &lt;pre&gt;<br /> xmllint --noout --schema http://www.opengis.net/wmts/1.0 WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> oder<br /> &lt;pre&gt;<br /> xmllint --noout --schema http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> (Falls das Schema lokal vorhanden ist, kann auch der Pfad zur Schema-Datei angegeben werden. Umgekehrt kann die XML-Datei auch als URL angegeben werden, um eine online verfügbare Version zu validieren. Allerdings scheint für Schema und XML nur HTTP, nicht aber HTTPS zu funktionieren.)<br /> <br /> ==== Mit &lt;code&gt;xsd-validator&lt;/code&gt; ====<br /> <br /> (Kleines Java-Programm, das den Standard-XML-Parser der JRE (normalerweise Xerces) verwendet.)<br /> <br /> &lt;pre&gt;<br /> git clone https://github.com/amouat/xsd-validator.git<br /> wget http://www.opengis.net/wmts/1.0 --output-document=wmts.xsd<br /> wget http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd<br /> ./xsd-validator/xsdv.sh wmts.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> <br /> oder einfach<br /> <br /> &lt;pre&gt;<br /> git clone https://github.com/amouat/xsd-validator.git<br /> wget http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd<br /> ./xsd-validator/xsdv.sh wmtsGetCapabilities_response.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> <br /> (&lt;code&gt;xsd-validator&lt;/code&gt; kann nur mit lokalen Schema-Dateien umgehen, daher laden wir diese(s) hier mit &lt;code&gt;wget&lt;/code&gt; selbst herunter. Auch die XML-Datei muss lokal vorliegen.)<br /> <br /> <br /> === TileMatrixSet ===<br /> <br /> Für einen Kachel-Satz nach OSM- &amp; Google Maps-Konvention kann das &quot;Well-known scale set&quot; &quot;GoogleMapsCompatible&quot; (&lt;code&gt;&lt;nowiki&gt;urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible&lt;/nowiki&gt;&lt;/code&gt;) aus Annex E.4 des [http://portal.opengeospatial.org/files/?artifact_id=35326 Standards] verwendet werden.<br /> <br /> ==== Scale Denominator ====<br /> <br /> In Tabelle E.4 &quot;Definition of Well-known scale set GoogleMapsCompatible&quot; im Standard sind die Werte des &quot;Scale Denominator&quot; bereits für die Zoom-Levels 0&amp;ndash;18 angegeben. Diese lassen sich aber auch wie folgt berechnen:<br /> <br /> ===== Herleitung =====<br /> <br /> In Abschnitt 6.1 &quot;Tile matrix set – the geometry of the tiled space&quot; des Standards erhalten wir (unten auf Seite 8) u.A. folgende beiden Formeln:<br /> &lt;pre&gt;pixelSpan = scaleDenominator × 0.28e-3 / metersPerUnit(crs)&lt;/pre&gt;<br /> <br /> Die Standard-Pixelgrösse ist gemäss OGC SLD Standard 0.28 Millimeter.<br /> <br /> &lt;pre&gt;tileSpanX = tileWidth × pixelSpan&lt;/pre&gt;<br /> <br /> Daraus folgt<br /> &lt;pre&gt;tileSpanX = tileWidth × scaleDenominator × 0.28e-3 / metersPerUnit(crs)&lt;/pre&gt;<br /> und daraus durch auflösen nach &lt;code&gt;scaleDenominator&lt;/code&gt;<br /> &lt;pre&gt;scaleDenominator = tileSpanX × metersPerUnit(crs) / (tileWidth × 0.28e-3)&lt;/pre&gt;<br /> <br /> Die Kachel-Kantenlänge in Pixel &lt;code&gt;tileWidth&lt;/code&gt; ist bei OSM &amp; Google immer '''256'''.<br /> <br /> Das CRS WebMercator verwendet (pseudo-)Metrische Koordinaten, daher ist &lt;code&gt;metersPerUnit(crs)&lt;/code&gt; hierfür '''1'''.<br /> <br /> Bei Zoomlevel &lt;code&gt;Z&lt;/code&gt; wird die Welt zwischen 85.06°S and 85.06°N (und von 180°W bis 180°O) auf &lt;code&gt;2^Z × 2^Z&lt;/code&gt; Kacheln abgebildet. Entlang des Äquators hat man also &lt;code&gt;2^Z&lt;/code&gt; Kachel-Kanten. Laut Annex E.4 stimmen die &quot;Scale Denominator&quot;-Werte nur in Äquatornähe, also können wir das verwenden. Der Äquator-Radius ([http://www.epsg-registry.org/report.htm?type=selection&amp;entity=urn:ogc:def:crs:EPSG::3857&amp;reportDetail=short&amp;style=urn:uuid:report-style:default-with-code&amp;style_name=OGP%20Default%20With%20Code&amp;title=EPSG:3857 im EPSG-Eintrag] &quot;Semi-Major Axis (a)&quot; genannt) ist der von WGS 84 und beträgt '''6'378'137&amp;nbsp;m'''. Mit &lt;code&gt;Tau&lt;/code&gt; (a.k.a. &lt;code&gt;2&amp;nbsp;Pi&lt;/code&gt;) multipliziert ergibt dies die Äquatorlänge. Damit ist<br /> &lt;pre&gt;<br /> tileSpanX = Äquatorlänge / (2^Z)<br /> = 6378137 × Tau / (2^Z)<br /> &lt;/pre&gt;<br /> <br /> Damit ergibt sich<br /> &lt;pre&gt;scaleDenominator = (6378137 × Tau / (2^Z)) / (256 × 0.28e-3)&lt;/pre&gt;<br /> oder umgeformt die<br /> <br /> ===== Berechnungsformel =====<br /> &lt;pre&gt;scaleDenominator = 6378137 × Tau / (256 × (2^Z) × 0.28e-3)&lt;/pre&gt;<br /> <br /> Berechnung für Zoomlevels 0&amp;ndash;18 in Python 3.6:<br /> &lt;pre&gt;<br /> from math import tau<br /> <br /> equator_length = 6378137 * tau<br /> {i : equator_length / (256 * 2**i * 0.28e-3) for i in range(19)}<br /> &lt;/pre&gt;<br /> &lt;pre&gt;<br /> {0: 559082264.0287178,<br /> 1: 279541132.0143589,<br /> 2: 139770566.00717944,<br /> 3: 69885283.00358972,<br /> 4: 34942641.50179486,<br /> 5: 17471320.75089743,<br /> 6: 8735660.375448715,<br /> 7: 4367830.1877243575,<br /> 8: 2183915.0938621787,<br /> 9: 1091957.5469310894,<br /> 10: 545978.7734655447,<br /> 11: 272989.38673277234,<br /> 12: 136494.69336638617,<br /> 13: 68247.34668319309,<br /> 14: 34123.67334159654,<br /> 15: 17061.83667079827,<br /> 16: 8530.918335399136,<br /> 17: 4265.459167699568,<br /> 18: 2132.729583849784}<br /> &lt;/pre&gt;<br /> <br /> ==== Pixel Size (m) ====<br /> <br /> Die im Annex E.4 angegebenen (obwohl im XML wohl nicht anzugebenden) Pixel-Grössen in Metern ergeben sich, wenn man aus obiger Formel den 0.28&amp;nbsp;mm/px-Faktor weglässt:<br /> &lt;pre&gt;pixelSize = 6378137 × Tau / (256 × (2^Z))&lt;/pre&gt;<br /> <br /> Berechnung für Zoomlevels 0&amp;ndash;18 in Python 3.6:<br /> &lt;pre&gt;<br /> from math import tau<br /> <br /> equator_length = 6378137 * tau<br /> {i : equator_length / (256 * 2**i) for i in range(19)}<br /> &lt;/pre&gt;<br /> &lt;pre&gt;<br /> {0: 156543.03392804097,<br /> 1: 78271.51696402048,<br /> 2: 39135.75848201024,<br /> 3: 19567.87924100512,<br /> 4: 9783.93962050256,<br /> 5: 4891.96981025128,<br /> 6: 2445.98490512564,<br /> 7: 1222.99245256282,<br /> 8: 611.49622628141,<br /> 9: 305.748113140705,<br /> 10: 152.8740565703525,<br /> 11: 76.43702828517625,<br /> 12: 38.21851414258813,<br /> 13: 19.109257071294063,<br /> 14: 9.554628535647032,<br /> 15: 4.777314267823516,<br /> 16: 2.388657133911758,<br /> 17: 1.194328566955879,<br /> 18: 0.5971642834779395}<br /> &lt;/pre&gt;</div> Das-g https://giswiki.hsr.ch/index.php?title=Agenda&diff=70257 Agenda 2024-02-08T22:42:43Z <p>Das-g: /* Anlässe am OST Campus Rapperswil und/oder mit dem IFS Geometa Lab der OST */ Mapping Party wurde auf 2024-03-22 verschoben, siehe https://giswiki.hsr.ch/index.php?title=15._Mapathon_%26_Mapping_Party_Rapperswil_2024&amp;diff=prev&amp;oldid=70249</p> <hr /> <div>'''Agenda zu Aus- und Weiterbildung im Bereich GIS (GISTech, Location Intelligence, Spatial Data Science), Data Engineering (Data Analytics, Datenbanksysteme) sowie Open Data wie OpenStreetMap/Missing Maps oder Wikidata (Zum [[Agenda Archiv|Archiv dieser Agenda]]).'''<br /> [[Bild:Spatial_Data_Science.png|150px||right|link=http://www.ost.ch/ifs]]<br /> [[Bild:SwissPythonSummit-Logo.png‎|150px||right|link=http://www.python-summit.ch/]]<br /> [[Bild:PostgreSQL Logo.png |150px||right|link=Kurs_PostGIS]]<br /> [[Bild:PostGIS_Postgres_Logo_150x150.jpg‎ |150px||right|link=Kurs_PostGIS]]<br /> [[Bild:QGIS_Logo_600x550.png|200px||right|link=Kurs_QGIS]]<br /> [[Bild:OSM_Logo.png|150px||right|link=Party]]<br /> __NOTOC__<br /> <br /> == Anlässe am OST Campus Rapperswil und/oder mit dem IFS Geometa Lab der OST ==<br /> <br /> * 1. Quartal 2024, 19:00-20:00: '''&quot;Verwaltung von Vektordaten - Ein Benchmark mit Milvus und PostgreSQL&quot;''' (Vortrag von Stefan Keller). Punto d’Incontro, Josefstrasse 102 Zürich. freier Eintritt, keine Konsumationspflicht). https://www.swisspug.org <br /> * Mo. 4. März 2024 17:00-21:00: '''Engineers' Day''' mit Beteiligung des IFS. https://www.ost.ch/de/studium/technik/engineers-day<br /> * Fr. 22. März 2024, 14:00-~21:00: '''15. Mapathon &amp; Mapping Party Rapperswil''' (mit &quot;Ask-us-Anything&quot;). [[Mapathon|https://giswiki.hsr.ch/Mapathon]]<br /> * Di. 14. Mai und Do. 23. Mai, jeweils 16:00-17:30 Uhr und 19:00-20:30 Uhr: '''Webinar “OSM für Interessierte aus Feuerwehren”'''. offen für alle Interessierten; online via [https://bbb.ch-open.ch/rooms/ste-imh-idc-p7g/join BigBlueButton]. Kontakt: Stefan Keller.<br /> * 27. + 28. Juni 2024: '''Swiss PGDay 2024''' - die Schweizer PostgreSQL-Datenbank-Konferenz (en+de), OST Campus Rapperswil. https://www.pgday.ch<br /> * 17. + 18. Oktober 2024: '''Swiss Python Summit 2024''', OST Campus Rapperswil, Aula. https://www.python-summit.ch/<br /> * Di. 5. November 2024, 16:00 - 20:00: '''AI@OST-Tagung 2024''', OST Campus Rapperswil, Aula. https://www.ost.ch/de/event/aiost-tagung-2024<br /> <br /> Aktionen des IFS Geometa Lab der OST:<br /> * Aktionen '''Projekt des Monats Schweiz (PotM CH)''': https://wiki.openstreetmap.org/wiki/DE:Project_of_the_month_Switzerland (virtuell)<br /> * Projekt '''Burgen-Dossier''' zusammen mit Wikimedia Schweiz, u.a. mit Burgen-Foto-Challenge: &quot;[http://umap.osm.ch/m/3136/ Karte fehlender Burgen...]&quot;<br /> * Projekt '''Nebelkarte''': [https://www.nebelkarte.ch www.nebelkarte.ch]<br /> <br /> Siehe auch das [http://geowebforum.ch GEOWebforum]. Folgen Sie uns auch auf '''[https://twitter.com/sfkeller Twitter @sfkeller]''' und [https://twitter.com/geometalab @geometalab].<br /> <br /> == Kurse vom IFS Geometa Lab on-site am OST-Campus Rapperswil (oder virtuell) ==<br /> <br /> * Do./Fr. 15./16. Februar 2024: '''[[Kurs_QGIS_FF|Kurs QGIS für Fortgeschrittene]]''' (2 Tage, on-site)<br /> * Do./Fr. 5./6. September 2024: '''[[Kurs_QGIS|Kurs QGIS Einführung]]''' (2 Tage, on-site)<br /> * Do./Fr. 19./20. September 2024: '''[[Kurs_QGIS_FF|Kurs QGIS für Fortgeschrittene]]''' (2 Tage, on-site)<br /> * Di./Mi. 24.+25. September 2024: '''[[Kurs_PostGIS|Kurs PostGIS-Einführung (inkl. PostgreSQL)]]''' (2 Tage, on-site)<br /> <br /> Siehe immer auch die Ankündigungen im [https://www.geowebforum.ch GEOWebforum]. Weitere Kurse (Weiterbildung) an der OST: <br /> * Auf Anfrage, u.a.'''[[Webinar_QGIS_Einstiegshilfe|Webinar QGIS Einstiegshilfe]]''' (online, jeweils 16:00 Uhr mind. 90 min. + Selbststudium)<br /> * '''Weiterbildung an der OST''': [https://www.ost.ch/de/weiterbildung/weiterbildungsangebot/raum-und-mobilitaet/bau-und-planung/ CAS Geodaten und GIS in der Planung / MAS in Raumentwicklung] sowie [https://www.ost.ch/de/weiterbildung/weiterbildungsangebot/informatik weitere Kurse in der Informatik].<br /> * '''Fernstudium UNIGIS Master of Science in Geographic Information Science &amp; Systems'''. Infos und Anmeldung [https://unigis.at/unigis-master-of-science/]<br /> <br /> ''Tipps: Nutzen Sie '''[https://www.openschoolmaps.ch OpenSchoolMaps]''', unser kleines E-Learning-Projekt. Besuchen Sie die Rosenstadt Rapperswil mit Seepromenade, Altstadt, Schloss oder Kinderzoo per Schiff oder Zug. [https://knieskinderzoo.roundshot.com/ Webcam] mit Blick auf den Kinderzoo und den OST Campus Rapperswil.''<br /> <br /> == Weitere Veranstaltungen ==<br /> <br /> * Do., 21. März 2024, 9.30 – 12.30 Uhr: '''Spirgarten-Treffen 2024''', Hotel Spirgarten, Altstetten ZH. https://www.interlis.ch/veranstaltungen/veranstaltungen/spirgarten-2024<br /> * Mi. 15. Mai 2024: '''GEOSummit 2024 - Kongress und Ausstellung'''. FHNW Olten (u.a. mit den Blöcken &quot;Open Data&quot; sowie &quot;GIS in Blaulichtorganisationen&quot;). https://www.geosummit.ch<br /> * 6-8 Sept. 2024: SotM 2024. Nairobi (Kenya): https://2024.stateofthemap.org/<br /> <br /> == Weitere Agenden ==<br /> <br /> * GIS: [http://www.sogi.ch/index.php?id=33 SOGI-Agenda]<br /> * GIS [http://www.geobranchen.de/index.php?&amp;option=com_geoevents&amp;page=eventquery&amp;gbrselect=all GIS-Events auf Geobranchen.de]<br /> * OST: [http://www.ost.ch/weiterbildung Weiterbildungs-Kurse/-Seminare der OST] Campus Rapperswil<br /> <br /> == An- und Abmeldungen von Kursen ==<br /> <br /> Bei Kursen (z.B. Tageskurse und Seminaren) wird spätestens 14 Tage vor dem geplanten Termin entschieden (und dort angegeben), dass und ob der Kurs durchgeführt wird. Sobald entschieden ist, ob ein Kurs durchgeführt wird, wird das auf der Kursseite angegeben. Das kann erfahrungsgemäss bis zu einem Monat vor dem Durchführungstermin sein.<br /> <br /> Die '''Abmeldung''' eines Kurses (Seminar, Workshop) ist in jedem Falle mit administrativem Aufwand verbunden. Je nach Abmeldungszeitpunkt wird das Kursgeld ganz oder teilweise erlassen und zwar wie folgt:<br /> <br /> * Für Abmeldungen bis vor 10 Kalendertagen vor Kursbeginn: keine Verrechnung.<br /> * Ab 10 Kalendertagen bis 6 Kalendertage vor Kursbeginn: Bearbeitungsgebühr CHF 200.- pro Teilnehmender.<br /> * Ab 5 Kalendertagen vor Kursbeginn: Das Kursgeld ist im vollen Umfang zu entrichten.<br /> <br /> Abmeldungen müssen stets schriftlich (Briefpost oder E-Mail) mitgeteilt werden. Bei Abmeldung in Folge entschuldbarer Gründe wird das Kursgeld erlassen; es wird eine Bearbeitungsgebühr von CHF 200.- verrechnet. Entschuldbare Gründe sind 1. Todesfall im Familienumfeld (Anzeige beilegen) oder 2. Unfall (Arztzeugnis belegen).<br /> <br /> <br /> [[Kategorie:GIS]] [[Kategorie:Event]] [[Kategorie:Weiterbildung]]</div> Das-g https://giswiki.hsr.ch/index.php?title=GIS_Day_2023_OST&diff=69919 GIS Day 2023 OST 2023-09-26T11:55:51Z <p>Das-g: Noch kürzere URL 🎉</p> <hr /> <div>&lt;span style=&quot;font-family:arial,helvetica,sans-serif;&quot;&gt;<br /> [[Datei:OST_Campus_RJ_Gebaeude_8.png|x200px]] <br /> __NOTOC__<br /> == GIS Day 2023 @ OST Campus Rapperswil 15. November 2023 ab 14:10 Uhr &quot;GOING OUT WITH GIS!&quot; ==<br /> [[Datei:GIS Day 2016 Photo 1.png|x150px|right]] <br /> &gt;&gt; Save-the-Date! Save-the-URL [https://ost.ch/gisday ost.ch/gisday]! #GISDay2023OST &lt;&lt;<br /> <br /> Das war ein gelungener [[GIS_Day_2022_OST|GIS Day 2022 OST]]! Das Motto des diesjährigen '''GIS Day 2023 @ OST Campus Rapperswil''' ist '''&quot;GOING OUT WITH GIS!&quot;'''. Nebst Informationen zur mobilen Geodatenerfassung und einem Überblick über die Weiterbildungsszene in der Schweiz wird es in der Pause und nach dem Apéro genügend Zeit zum Netzwerken geben. <br /> <br /> Der globale, '''internationale GIS Day''' ist eine Initiative innerhalb der jährlichen Geography Awareness-Woche, um '''räumliches Denken und geographische Informationssysteme (GIS)''' bekannter zu machen. Geoinformation und GIS umfassen eine breite Palette von Kartenlesen, Navigation und Lagekarten bis zu 3D und Augmented Reality. GIS helfen massgeblich mit, die Herausforderungen von Energie, Klima, Verkehr und Naturgefahren zu meistern. Hier ein Rückblick zum vergangenen [[GIS_Day_2022_OST]].<br /> <br /> == Programm == <br /> [[Datei:OST_Campus_RJ_Raum_8U44_SIA_Feb_2016_2.jpg|x150px|right]]<br /> [[Datei:Logo_GISday_2022_400x400.png|x150px|right]]<br /> <br /> Programm (Entwurf, provisorisch): <br /> * 14:10 Begrüssung und ggf. Keynote, Moderation Stefan Keller (IFS OST FH) <br /> * 14:00 Inputreferate - Moderation tba.<br /> ** '''&quot;tbd.'', N.N. (Raum- und Verkehrsplanung)<br /> ** '''&quot;tbd.'', N.N. (Landschaftsplanung)<br /> ** '''&quot;Felddatenerfassung mit QField (tbd.)&quot;''', Marco Bernasocchi (OPENGIS.ch)<br /> * 15:10 Kaffee-Pause: Netzwerken und Besuch der Tischmesse<br /> * 16:00 Inputreferate fortges. - Stefan Keller (IFS OST FH)<br /> ** '''&quot;ChatGPT in der (UNIGIS-) Lehre (tbd.)&quot;''', Petra Stutz (tbc.) (Z_GIS Salzburg und UNIGIS)<br /> ** '''&quot;GeoAI - der neue Trend im GIS (tbd.)''', Stefan Keller (IFS OST FH)<br /> * 16:40 '''Auszeichnungen''': UNIGIS-Schweiz-Preis für exzellente Abschlussarbeiten (Stifter:in UNIGIS/Z_GIS Salzburg); &quot;OSGAR - der Open Source GIS Award&quot; - Ehrenpreis (Stifter:in Klimacluster und IFS OST). <br /> * 17:00 Apéro/Netzwerken (bis ca. 19 Uhr)<br /> <br /> Begleitprogramm - Tischmesse: ...von ArcGIS bis QGIS, von Open Government Data bis OpenStreetMap) sowie mit Aus- und Weiterbildungsangeboten für &quot;grüne Berufe&quot; (Raumplanung, Landschaftsarchitektur, Umweltingenieurwesen, Informatik, Geomatik, etc.).<br /> <br /> Anmeldung:<br /> [[Datei:Video_zum_OST_Campus_RJ_und_GIS_Day_2014.png|x150px|right|https://www.youtube.com/watch?v=RWs1zgGjqq8]]<br /> * Was? Es gibt 1. Inputreferate und 2. Tischmesse, sowie 3. Apéro. Der offizieller Weblink ist [https://www.ost.ch/gisday www.ost.ch/gisday].<br /> * Wer? GIS-Fachpersonen, OST-interne Stellen sowie Geografie-Lehrer:innen (die Anzahl der Teilnehmenden ist limitiert). <br /> * Wo? OST Campus Rapperswil (SG) - dem &quot;schönsten Campus der Schweiz&quot; (Gebäude 8, Raum 8.U44). [https://www.qwant.com/maps/place/osm:way:256838767@Ostschweizer_Fachhochschule_Campus_Rapperswil_Jona#map=17.47/47.2232889/8.8177634 Lagekarte (Qwant)] und [https://knieskinderzoo.roundshot.com/ Webcam].<br /> * Registration / Formular (kostenlos): (noch nicht freigeschaltet; Fragen bitte an Prof. Stefan Keller stefan.keller@ost.ch).<br /> <br /> Wir freuen uns wieder auf eine rege Teilnahme.<br /> <br /> == Tischmesse == <br /> <br /> Bei der Tischmesse gibt es für Aussteller einen Tisch (inkl. 220V-Stromverteiler), einen Stuhl und wahlweise entweder eine Stellwand (A0 hoch/quer, Vorderseite) oder ein Rollup/Beachflag. Die Tischmesse beginnt ca. 13:30 Uhr, als etwas vor Beginn der Veransaltung um 14:10 Uhr.<br /> <br /> Tischmesse-Teilnehmende melden sich direkt bei Prof. Stefan Keller stefan.keller@ost.ch und werden gebeten sich zusätzlich separat und rechtzeitig als Teilnehmer anzumelden. Die Teilnahmegebühr ist 100 CHF (ausgenommen OST-interne Stellen).<br /> <br /> == Sponsoring ==<br /> <br /> * Der/die Referenten:in für die Keynote und die Referierenden werden vom Organisationskomitee angefragt.<br /> * Auch die Sponsoren für die Kaffeepause und den Apéro werden vom Organisationskomitee angefragt.<br /> <br /> == Kontakt und Social Media ==<br /> <br /> Zu den internationalen Webseiten der [https://www.aag.org/geoweek-2022/twi Geography Awareness Week] und des [https://www.gisday.com/ GIS Day].<br /> <br /> Die Organisatoren: Geometa Lab, OST Ostschweizer Fachhochschule. Fragen bitte per Mail an Stefan.Keller (@OST).<br /> <br /> '''Hashtag #GISDay2023OST''' | '''[https://twitter.com/search?q=%23GISDay2023OST X/Twitter]''' | '''[https://www.linkedin.com/events/gisday2022ost6986427861498748928 LinkedIn]''' | [https://www.ost.ch/de/event/event/gisday-2022 OST-News]. <br /> <br /> <br /> ''OST – Ostschweizer Fachhochschule ist der Zusammenschluss aus FHS St.Gallen, HSR Rapperswil und NTB Buchs''<br /> &lt;/span&gt;</div> Das-g https://giswiki.hsr.ch/index.php?title=MediaWiki:Common.css&diff=68656 MediaWiki:Common.css 2022-09-21T15:45:47Z <p>Das-g: </p> <hr /> <div>/* Das folgende CSS wird für alle Benutzeroberflächen geladen. */<br /> .mw-body h1, .mw-body h2, .mw-body h3, .mw-body h4, .mw-body h5, .mw-body h6, .mw-body #firstHeading {<br /> font-family: sans;<br /> }</div> Das-g https://giswiki.hsr.ch/index.php?title=MediaWiki:Common.css&diff=68655 MediaWiki:Common.css 2022-09-21T15:44:27Z <p>Das-g: Die Seite wurde neu angelegt: «/* Das folgende CSS wird für alle Benutzeroberflächen geladen. */ .mw-body h1, .mw-body #firstHeading { font-family: sans; }»</p> <hr /> <div>/* Das folgende CSS wird für alle Benutzeroberflächen geladen. */<br /> .mw-body h1, .mw-body #firstHeading {<br /> font-family: sans;<br /> }</div> Das-g https://giswiki.hsr.ch/index.php?title=Interlis&diff=68160 Interlis 2021-04-30T10:18:15Z <p>Das-g: /* Weblinks */ englischsprachigen Wikipedia-Artikel verlinkt</p> <hr /> <div>Interlis ist in der Schweiz ein Standard für den Austausch von Daten zwischen Informationssystemen unter besonderer Berücksichtung von geografischen Informationssystemen (GIS). Es ist einerseits eine Beschreibungssprache für die Modelle (ili) und ein Austauschformat (itf). Neben dem bewährten Interlis 1-Transfer-Dateiformat (ITF) gibt es auch das Interlis 2-Transfer-Dateiformat, das XML-basierend ist.<br /> <br /> Siehe auch: <br /> * [[Interlis-Weiterentwicklung]]<br /> * [[Interlis-FAQ]], [[GIS-Datei-Format]], [[Datenmodell]], [[Geodaten]].<br /> * Mit welchen Konvertern kann man Interlis-Daten importieren und exportieren? Siehe unten.<br /> * Wie modelliert man? Was sind Darstellungsmodelle? Siehe [[Datenmodell]].<br /> <br /> <br /> == Dokumentation ==<br /> <br /> Interlis gibt es zur Zeit in folgenden Versionen:<br /> * Interlis Version 1:<br /> ** [http://www.interlis.ch/interlis1/download_d.php Spezifikation, Hinweise, Glossar und Benutzerhandbücher] etc.<br /> ** Interlis 1-Schema (.ILI), Interlis 1-Transfer-Dateiformat (.ITF).<br /> * Interlis Version 2.3:<br /> ** [http://www.interlis.ch/interlis2/download23_d.php Spezifikation, Handbücher, Werkzeuge, Testdaten] etc.<br /> ** Interlis 2-Schema (.ILI) und Interlis 2-Transfer-Dateiformat in XML (.XTF).<br /> * Interlis Version 2.4:<br /> ** tba. 2017<br /> <br /> Man beachte, dass es auch ein Interlis-Metamodell in XML gibt, das vom Interlis-Compiler erzeugt werden kann.<br /> <br /> == Software ==<br /> <br /> Allgemein:<br /> * Siehe [http://www.interlis.ch interlis.ch], insbesondere die [http://www.interlis.ch/general/software_service.php Liste der Interlis Software und Dienste].<br /> <br /> INTERLIS-Daten-Checker:<br /> * Version 2.2+2.3 (Desktop-Applikation, Open Source, benötigt Java): http://www.eisenhutinformatik.ch/interlis/xtfcheck/ <br /> * Version 2.3 (Desktop-Applikation, Freeware): http://www.interlis.ch/interlis2/download23_d.php =&gt; &quot;Checker für INTERLIS 2 (Version 2016.0 vom 01.06.2016)&quot;<br /> * Version 1 (Commandline via ftp, frei): http://www.interlis.ch/general/itf2xml.php?language=d (der Service konvertiert Daten nach Version 2.3 und prüft sie dabei).<br /> * Version 1+2 (Desktop-Applikation, kommerziell): https://www.infogrips.ch/igcheck.html <br /> <br /> Editoren für INTERLIS-Datenbeschreibungs-Sprache:<br /> * [[UML-Editor]]<br /> * ILI-Plugin für Enterprise Architect (Ea2ili) (von RP AG?): Siehe [http://www.rpag.ch/cms/front_content.php?idcat=51]<br /> * Texteditor Notepad++; Download Syntax Language File für Interlis: [[Media:INTERLIS-syntax_for_Notepad_pp.zip]].<br /> <br /> Konverter für das INTERLIS-Format:<br /> * [http://www.eisenhutinformatik.ch/sitemap.htm Interlis-Tools] (z.T. Open Source) der Fa. Eisenhut Informatik AG, u.a. für PostGIS und GeoPackage.<br /> * [[GeoConverter]] - Webapplikation, frei, ohne Login. Ein Service des Geometa Lab der HSR.<br /> * [[OGR]] - Commandline Applikation, Open Source.<br /> * [[ITF2XML]] - Interlis 1 zu 2-Konverter, Commandline via ftp, frei.<br /> * [http://www.gismap.ch/ili-checker.html Interlis 1-Checker] der Fa. gismap.ch<br /> * [[FME]] Desktop-Applikation, [http://www.tydac.ch/de/fme_interlis.htm Interlis 1-Plug-in] (kostenpflichtig, Tydac) und [http://www.eisenhutinformatik.ch/interlis/ili2fme/ Interlis 2-Plug-in] (frei, Eisenhut Informatik)<br /> * [[IGTools]] Desktop-Applikationen und Webapplikationen (Checkservice)<br /> * [[Interlis Studio]] <br /> <br /> Sonstige Werkzeuge/Tools:<br /> * [http://wiki.hsr.ch/Prog1Java/wiki.cgi?DomainEncoder DomainEncoder] - Codierung von Aufzähltypen in Interlis 1<br /> * Shareware-Tools (Interlis 1) auf der [http://www.interlis.ch/interlis1/download_d.php Interlis-Homepage] und der [http://www.infogrips.ch/124.html Fa. infoGrips].<br /> <br /> == Community ==<br /> * Fragen zu Interlis können im Thema [http://www.geowebforum.ch/thema.php?themenID=18 Technische Aspekte von Interlis] des geowebforums nachgelesen und gestellt werden.<br /> * Mailingliste [https://lists.sourceforge.net/lists/listinfo/umleditor-ilicore umleditor-ilicore]. Die Liste ist öffentlich, jeder kann sich anmelden, das Archiv ist öffentlich, die Liste ist nicht moderiert, es sollten keine grossen Anhänge (&lt;40KB) verschickt werden.<br /> <br /> == Schulungen ==<br /> * [[CAS GIS Seminar-Tag]] am [[CAS GIS in der Planung]]<br /> * Weitere siehe GISpunkt [[Agenda]]<br /> <br /> == Weblinks ==<br /> * http://www.interlis.ch - die offizielle Website Interlis 1 und 2<br /> * englischsprachiger [https://en.wikipedia.org/wiki/Interlis Wikipedia-Artikel &quot;Interlis&quot;]<br /> <br /> [[Kategorie:Geodaten]] [[Kategorie:Dateiformat]]</div> Das-g https://giswiki.hsr.ch/index.php?title=3._Mapathon_Rapperswil_2021&diff=68144 3. Mapathon Rapperswil 2021 2021-04-13T16:56:44Z <p>Das-g: Rechtschreibung/Grammatik: Überflüssige &quot;s&quot; entfernt</p> <hr /> <div><br /> '''&gt;&gt; Mi. 14. April, 19 Uhr CEST: 3. Mapathon Rapperswil mit Missing Maps Zürich (virtuell), https://giswiki.hsr.ch/Mapathon &lt;&lt;'''<br /> <br /> [[File:7_Mapping_Party_Rappi_Group_Photo_IMG_0563_640_480.jpg||205px|frameless|right|The crowd]]<br /> [[File:Logo SOSM.png||205px|frameless|right|SOSM.ch]]<br /> Das ist ein '''Mapathon''' zu OpenStreetMap für Erfahrene und für Einsteiger. Der Event ist auf deutsch; fast alle Teilnehmer können jedoch auch Englisch. / [en] This is a '''Mapathon''' on OpenStreetMap for experienced and for beginners. The event is in German; however, almost all participants can speak English.<br /> <br /> * Mittwoch 14. April 2021 / [en] Wednesday April 14, 2021<br /> * Wann / When? 19:00 Uhr bis ca. 21 Uhr / [en] 7:00 pm until ~ 9:00 pm (CEST, UTC/GMT +2h) (Jemand ist schon eine Viertelstunde vorher da)<br /> * Wo / Where? Als Videokonferenz im Browser (no-install/no-login) mit '''BigBlueButton https://bbb.ch-open.ch/b/ste-633-awy'''.<br /> * Wer organisiert das? / [en] Who's the organizer? [https://www.ifsoftware.ch/ Geometa Lab am IFS OST] und [https://www.meetup.com/de-DE/Missing-Maps-Zurich/ Missing Maps Zürich]<br /> * '''Anmeldung / Registration: Mail an Stefan Keller [mailto:stefan.keller@ost.ch?subject=Mapathon&amp;body=Lieber%20Stefan%0A%0AGerne%20melde%20ich%20mich%20f%C3%BCr%20den%20%23MapathonRapperswil%20%2B%20%23mm_zurich%20an.%0A%0ALiebe%20Gr%C3%BCsse%2C%20 stefan.keller(at)ost.ch] mit Vermerk/Subject &quot;Mapathon&quot;''' (oder/or via [https://www.meetup.com/de-DE/Missing-Maps-Zurich/ Missing Maps Zürich])<br /> <br /> Ein virtueller Mapathon ist ein lockerer Online-Event zum gemeinsamen Erfassen von Daten für OpenStreetMap und zum Diskutieren. Es werden einerseits lokal Schulhäuser (oder sonst etwas Sinniges) gemappt ('''&quot;lokales Kartieren&quot;''') und andererseits &quot;Missing Maps&quot; ('''&quot;humanitäres Kartieren&quot;''')! &quot;Ask us Anything&quot;! / [en] A virtual mapathon is a casual online event for collaborative data collection for OpenStreetMap and discussion. On the one hand, local school buildings (or anything else useful) are mapped ('''local mapping''') and on the other hand &quot;missing maps&quot; ('''humanitarian mapping''')! &quot;Ask us Anything&quot;!<br /> <br /> Verfolgt den Mapathon z.B. auf / [en] Follow the mapathon p.ex. on '''Twitter: [https://twitter.com/search?q=%23MapathonRapperswil+%23mm_zurich #MapathonRapperswil #mm_zurich]''' .<br /> <br /> ''Wissenswertes: Dieser Mapathon hier ist virtuell. Ein Mapathon ist eine organisierte Versammlung von Leuten, um Daten zu OpenStreetMap hinzuzufügen. Das kann die Verbesserung der Karte in einer lokalen Umgebung sein, oder es kann das Eintragen von Informationen sein zur Unterstützung eines Projekts in einem Krisengebiet. Bei einem klassischen Mapathon würde man sich physisch in einem Raum treffen. Bei einer sogenannten [[Mapping Party]] würde zudem zuerst draussen kartieren, dann gemeinsam im Raum editieren. Dabei gibt es am Schluss meist Speis &amp; Trank.''<br /> <br /> '''Sie wollen selber einen Mapathon organisieren? Hier steht wie's geht https://www.openschoolmaps.ch (Outdoor Mapping Event)'''<br /> <br /> == Über [en] About ==<br /> <br /> * Der Event ist kostenlos. / [en] The event is free.<br /> * Warum teilnehmen? Weil es Spass macht bei der grössten Karte der Welt mitmachen zu können! / [en] Why participate? Because it's fun to participate at largest world wide map. <br /> * Vergangene Mapathons / [en] Past Mapathons: https://giswiki.hsr.ch/Kategorie:Mapathon<br /> * Was ist OpenStreetMap? / [en] What is OpenStreetMap? [https://www.openstreetmap.de/faq.html#was_ist_osm FAQ auf .de], [https://osm.ch/osm.html Why OSM auf OSM.ch], [https://mamapa.org/info/osm-mapping/openstreetmap Kurz-Videos (de und en)], [[OSM#Was_ist_OpenStreetMap? Weitere...]] Eine kleine Einführung mit Cheat Sheet (Schweiz-bezogen) gibt es auf [https://openschoolmaps.ch/ OpenSchoolMaps].<br /> <br /> Der Anlass entspricht den [https://wiki.osmfoundation.org/wiki/Organised_Editing_Guidelines ('Organised Editing Guidelines')]. / [en] This event is compliant with the [https://wiki.osmfoundation.org/wiki/Organised_Editing_Guidelines ('Organised Editing Guidelines')].<br /> <br /> == Das Programm [en] The Program ==<br /> <br /> Es gibt Raum 1 für Deutsch. There's room 2 for english. <br /> In Teil 2 / part 2 wandeln sich die Räume zu bilingue und Raum 1 ist Local-Mapping und Raum 2 ist HOT-Mapping.<br /> <br /> Teil 1 / Raum 1 - Deutsch:<br /> * 18:30 : (Empfang) (Stefan)<br /> * 19:00 : '''Eröffnung''' (Stefan)<br /> * 19:05 : OSM Intro; Lokales Mappen (Stefan)<br /> * 19:35 : HOT Intro; Tasks vorstellen (Selina, Katharina, Dani) <br /> <br /> Part 1 / Room 2 - English:<br /> * 18:30 : (Reception) (Stefan)<br /> * 19:00 : '''Opening''' (Stefan)<br /> * 19:05 : HOT Intro; introduce tasks (Selina, Katharina, Dani) <br /> * 19:35 : OSM Intro; Local mapping (Stefan)<br /> <br /> ---<br /> <br /> Teil 2 / part 2 - Raum 1/room 1 - '''Local mapping'''<br /> * 20:00 : bilingue Deutsch / english (Stefan)<br /> * 21:00 : &quot;Open End&quot;: AuA (Ask Us Anything)<br /> <br /> Teil 2 / part 2 - Raum 2/room 2 - '''HOT mapping'''<br /> * 20:00 : bilingue Deutsch / english (Selina, Katharina, Dani) <br /> * 21:00 : &quot;Open End&quot;: AuA (Ask Us Anything)<br /> <br /> <br /> == Anmeldung [en] Registration ==<br /> <br /> * Anmeldung: siehe oben.<br /> * Mitbringen: Gute Laune :-)<br /> * Vorbereitung: Account erstellen, falls nötig: https://www.openstreetmap.org/user/new<br /> <br /> <br /> == Was mappen? [en] What to map? ==<br /> <br /> '''Das Motto diesmal ist &quot;Schulen mappen&quot;! (&quot;Site Mapping&quot;) sowie Krisengebiete mappen (Missing Maps)'''. Wer will, kann auch selber nach Lust &amp; Laune mappen!<br /> <br /> '''&gt;&gt; Diese Changeset-Kommentare und Hashtags: #MapathonRapperswil #mm_zurich &lt;&lt;'''<br /> <br /> Kollaborativer Online-Text-Editor / [en] Collaborative online text editor: https://etherpad.wikimedia.org/p/3_Mapathon_Rapperswil_2021 <br /> <br /> === Lokales Kartieren [en] Local Mapping === <br /> <br /> Schulgelände (kindergarten/school/college/university grounds) als Bereich mit amenity=kindergarten/school/college/university mit Tags name, addr:*, website taggen. <br /> <br /> Hinweis: <br /> * Die Arealgrenzen können unklar definiert sein. <br /> * Erfasse Gebäude als Flächen mit building=school oder als Punkte mit amenity=school (name= nur hinzufügen, falls vorhanden). <br /> * Idealerweise werden Gebäude mit Ebenen und Räumen getaggt (z.B. um einen Campusplan zu ermöglichen; siehe &quot;Simple Indoor Tagging&quot; und [https://geometalab.gitlab.io/campus-maps-with-openstreetmap/ifs-campus-map/ IFS Campus Map]).<br /> <br /> Tipps: <br /> * Schule etwas genauer bezeichnen mit &quot;[https://wiki.openstreetmap.org/wiki/DE:Key:isced:level isced:level=*]&quot; (mit Zahl in Klammern): Primarschule/Volksschule (1), Sekundarschule/Realschule/Vor-Gymnasium (2), Gymnasium/Berufsschule (3).<br /> * Private und kommerzielle Schulen von &quot;öffentlichen&quot; unterscheiden.<br /> <br /> Weitere Informationen: <br /> * Dokumentation von OSM: https://wiki.openstreetmap.org/wiki/DE:Tag:amenity=school<br /> * Blog-Post: http://www.mappa-mercia.org/2016/02/how-to-map-a-school-in-openstreetmap.html<br /> * Blog-Post: https://www.mapzen.com/blog/targeted-editing-school-polygons/ <br /> * Blog-Post: https://npgeo-corona-npgeo-de.hub.arcgis.com/datasets/366c54083ee843b8bfb41b1e43ac04d9_0?geometry=9.597%2C51.253%2C11.343%2C51.403<br /> <br /> <br /> === Humanitäres Kartieren [en] Humanitarian Mapping === <br /> <br /> Je nach aktueller Lage in den Krisengebieten. Siehe auch der HOT Tasking Manager https://tasks.hotosm.org/ .<br /> <br /> [en] Depending on the current situation in the crisis areas. See also the HOT Tasking Manager https://tasks.hotosm.org/ .<br /> <br /> <br /> [[Kategorie:Mapathon]]</div> Das-g https://giswiki.hsr.ch/index.php?title=Diskussion:Leaflet&diff=67539 Diskussion:Leaflet 2020-03-01T23:00:58Z <p>Das-g: Neuer Abschnitt /* &quot;der Fa. Cloudmade&quot; */</p> <hr /> <div>== &quot;der Fa. Cloudmade&quot; ==<br /> <br /> &lt;blockquote&gt;Javascript-Library für interaktive Webkarten der Fa. Cloudmade.&lt;/blockquote&gt;<br /> <br /> Ist diese Hersteller-Angabe noch aktuell? --Raphael Das Gupta ([[Benutzer:Das-g|das-g]]) 00:00, 2. Mär. 2020 (CET)</div> Das-g https://giswiki.hsr.ch/index.php?title=Leaflet&diff=67538 Leaflet 2020-03-01T22:58:18Z <p>Das-g: fix typo</p> <hr /> <div>Javascript-Library für interaktive Webkarten der Fa. Cloudmade.<br /> <br /> Siehe auch [[OpenLayers]], [[Web Map Tiling]], [[Geovisualisierung]].<br /> <br /> * Website: http://leafletjs.com/<br /> * Plugins: für GPX, KML, Google Maps, Bing: https://github.com/shramov/leaflet-plugins<br /> * Code Snippet (Leaflet vs. OpenLayers): [http://dennisligtenberg.github.io/leaflet-0.7.3vs.openlayers-3/index.html Siehe Demo] ([https://github.com/DennisLigtenberg/leaflet-0.7.3vs.openlayers-3 Code Repo])<br /> <br /> [[Kategorie:JavaScript]]</div> Das-g https://giswiki.hsr.ch/index.php?title=Kurs_Apache_Superset&diff=67351 Kurs Apache Superset 2019-11-11T15:23:02Z <p>Das-g: Schreibe &quot;Open-Source-Programm&quot; mit Bindestrich anstatt ausseinander</p> <hr /> <div>[[File:Logo_Apache_Superset.png|150px||right|]]<br /> Schnell-Einstiegskurs (ein Tag) '''&quot;Apache Superset''' (Kürzel &quot;Kurs_Superset&quot;), das '''Daten-Visualisierungs- und Publikations-Werkzeug''' (&quot;Business Intelligence Tool&quot;). Leitspruch: &quot;Visualisierung einfacher als Excel und GIS!<br /> <br /> Für den Erfolg einer Entscheidungsfindung ist eine gute Visualisierung wichtig.<br /> Darum müssen die Erkenntnisse eines Anliegens, Projektes oder Umfrage visualisiert werden.<br /> Wenn Erkenntnisse anschaulicht und nachvollziehbar dargestellt werden, erhöht das deren Verständlchkeit und Akzeptanz.<br /> <br /> Visualisierung kann man zudem nicht nur zur Veranschaulichung einsetzen, sondern auch zu Datenanalyse.<br /> Häufig erkennt man Zusammenhänge in den Daten erst durch eine geschickte Darstellung.<br /> Wir Menschen sind schlecht darin, Zahlen zu vergleichen; grafische Muster dagegen erkennen wir gut.<br /> Visualisierung stellt somit nicht nur die Daten graphisch dar, sondern kann auch als eigene Technik der Datenanalyse eingesetzt werden.<br /> Das Internet ermöglicht zudem die Publikation der Visualisierung und damit die einfache Kommunikation mit Kunden und (Arbeits-)Kollegen.<br /> <br /> Apache Superset ist so ein Werkzeug zur Analyse, Visualisierung und zum Teilen (Sharing) von Datenquellen, d.h. von Tabellen (Excel oder LibreOffice) bis Geodaten. Es ist ein mächtiges, webbasiertes, interaktives Open-Source-Programm, das typischerweise als Cloud-Service genutzt wird. D.h. es ist keine Installation nötig (Web-Browser genügt) - und es werden keine Programmierkenntnisse verlangt (Grundkenntnisse der Tabellenkalkulation genügen für den Einstieg).<br /> <br /> Die Rohdaten müssen in aufbereiteter Form vorliegen, beispielsweise in einer PostgreSQL-Datenbank oder als CSV (siehe u.a. den [[Kurs PostGIS]]). Wenn nötig müssen sie mit Tabellenkalkulationsprogrammen oder QGIS aufbereitet werden (siehe u.a. den [[Kurs QGIS]] oder [[OpenSchoolMaps]]). <br /> <br /> ''&quot;An Apache Superset begeistert mich vor allem die Visualisierung und das Data-Sharing, welches einen leichten und ansprechenden Zugang zu den Visualisierungen erlaubt... und das Tempo mit dem eine Grafik erstellt werden kann. Die Filter-Funktion für das Dashboard ist beeindruckend.&quot;'' -- Eine Anwenderin, 23. September 2019.<br /> <br /> Nächste Durchführung: Fr. 24. Januar 2020 =&gt; '''[[Media:Kurs_Apache_Superset_HSR_Anmeldung.pdf |Zur Anmeldung (.pdf)]]'''<br /> Es hat noch Plätze frei. Anmeldeschluss ist eine Woche vor Kursbeginn um 12:00 Uhr. <br /> <br /> == Organisation ==<br /> [[File:Apache_Superset_Dashboard_World_Health.jpg|900px||right|]]<br /> <br /> * Dauer: 1 Tag, 9:00 bis ca. 16:30 Uhr. Raum tba.<br /> * Kosten (inkl. WLAN, 1 Kaffee und 1 Mittagessen): CHF 500.- (Einführungspreis)<br /> * Für folgende Teilnehmende gibt es 20% Rabatt: Studierende (bis 25 Jahre), UNIGIS-Studierende, ETH-Erdwissenschaften Alumni, sowie HSR-Mitarbeitende.<br /> * Referenten: Prof. Stefan Keller (HSR) und Mitarbeitende vom Institut für Software.<br /> * Schulungsart: Der Anteil Übungen und Theorie ist in etwa ausgeglichen. Die Teilnehmenden nehmen einen eigenen Laptop mit (bei Bedarf werden auch Laptops zur Verfügung gestellt). Es ist Sache der Teilnehmenden, ihr Laptop/Notebook gegen Beschädigung und Diebstahl zu (ver)sichern.<br /> * Durchführung: Die Teilnehmerzahl ist beschränkt auf 12 (max. 15) Plätze. Der Kurs findet ab fünf zahlenden Teilnehmern statt.<br /> * Abmeldungen: Angemeldete Teilnehmende können sich bis eine Woche vor Beginn ohne Kostenfolge schriftlich abmelden. Bis drei Tage vorher muss pauschal 200.- in Rechnung gestellt werden. Bei noch späteren Abmeldungen muss der volle Schulungsbetrag verrechnet werden.<br /> <br /> == Beschreibung ==<br /> <br /> Mit Apache Superset Daten erkunden, analysieren und visualisieren. <br /> Kurs mit interaktiven Übungen (mind. 50% zur &quot;Theorie&quot;) an einem durchgängigen Beispiel - alles dies ohne zu Programmieren oder sich um das Schreiben von SQL oder Formeln kümmern zu müssen.<br /> Nebst Business Charts werden auch interaktive Webkarten erstellt. <br /> Am Schluss wird Apache Superset mit anderen Werkzeugen verglichen, wie Tableau, MS PowerBI, Insights for ArcGIS oder uMap, dem Karteneditor.<br /> <br /> Auszug aus dem Programm:<br /> * Was sind Datenanalyse- und Data-Sharing-Werkzeuge (Business Intelligence Tools)?<br /> * Grundfunktionen: Benutzerverwaltung, Datenquellen, Charts (inkl. interaktive Karten) sowie Dashboards<br /> * Übung Datenanalyse- und -Publikation in dreieinhalb Schritten:<br /> ** 1. Daten selektieren: Datenquellen vorbereiten <br /> ** 2. Daten visualisieren: Listen und Grafiken erstellen <br /> ** 3a. Daten präsentieren: Listen und Grafiken in einem Dashboard anordnen<br /> ** 3b. Daten publizieren: Ein Dashboard über das Web mit anderen teilen<br /> * Fortgeschrittene Funktionen: <br /> ** Erstellen eines Datenfilters <br /> ** Dashboards verwalten<br /> ** Eine eigene CSV-Datei als Datenquelle hochladen<br /> ** Daten als Karte visualisieren<br /> ** Datenquellen filtern (SQL)<br /> * Vergleich u.a. von Apache Superset mit anderen Werkzeugen<br /> * Ausblick: SQL Lab, Frage &amp; Antworten, etc.<br /> <br /> == Vorkenntnisse und Vorbereitung ==<br /> <br /> Vorkenntnisse: <br /> * Grundkenntnisse in Tabellenkalkulation und Analyse mit Excel bzw. LibreOffice/OpenOffice (z.B. Aggregationsfunktionen wie SUMME) <br /> * Grundkenntnisse in Datenbanksysteme (z.B. Tabellen, Attributtypen). <br /> * SQL-Kenntnisse oder andere Programmierkenntniss sind nicht nötig zum Verständnis dieses Kurses. <br /> <br /> Vorbereitung <br /> * Es soll ein gängiger Laptop mitgebracht werden mit gängigem Browser und funktionierendem WLAN-Anschluss (es werden keine Admin-Rechte verlangt).<br /> * Wer Daten hat (CSV-Dateien), die er analysieren, visualisieren und ggf. sharen möchte, kann diese ebenfalls mitnehmen.<br /> * Wer sich vorgängig informieren möchte, kann sich eines der Videos [https://www.youtube.com/results?search_query=%22Apache+Superset%22 hier] anschauen.<br /> <br /> == Software ==<br /> <br /> Es muss keine Software lokal installiert werden (gängiger Browser genügt). Apache Superset wird als Webapplikation (Cloud Service) während des Kurses frei zur Verfügung gestellt. Der Zugang kann danach bis Ende Jahr (2020) kostenlos weiterbenutzt werden (Wert des Apache Superset Cloud Services ca. CHF 100.- pro Jahr). Dann muss die Software entweder selber installiert werden (normalerweise auf einem Server) oder das Abonnement kann weiter kostenpflichtig verlängert werden.<br /> <br /> == Unterlagen ==<br /> <br /> * Offizielle Dokumentation von Apache Superset: https://superset.incubator.apache.org/ .<br /> * Auf [https://openschoolmaps.ch OpenSchoolMaps.ch] gibt es aktuelles Unterrichtsmaterial zu Apache Superset zum selber lernen ''(in Vorbereitung)''.<br /> * Buch mit ergänzendem Material: &quot;Apache Superset Quick Start Guide&quot; by Shashank Shekhar, Dec. 2018, 188 pages, Packt Publishing. Repository: https://github.com/PacktPublishing/Superset-Quick-Start-Guide .<br /> <br /> == Tipps und Tricks ==<br /> <br /> * Etherpad https://etherpad.wikimedia.org/p/Apache_Superset_HSR<br /> <br /> [[Kategorie:Weiterbildung]]</div> Das-g https://giswiki.hsr.ch/index.php?title=Party&diff=67316 Party 2019-10-10T14:25:15Z <p>Das-g: Weiterleitung updaten, nachdem Zielseite nach Mapathon &amp; Mapping Party Rapperswil 2019 verschoben wurde</p> <hr /> <div>#redirect[[Mapathon &amp; Mapping Party Rapperswil 2019]]</div> Das-g https://giswiki.hsr.ch/index.php?title=11._Mapathon_%26_Mapping_Party_Rapperswil_2019&diff=67314 11. Mapathon & Mapping Party Rapperswil 2019 2019-10-10T14:23:25Z <p>Das-g: Das-g verschob die Seite 11. Micro Mapping Party Rapperswil 2019 nach Mapathon &amp; Mapping Party Rapperswil 2019: Kein &quot;Micro&quot;, dafür verbunden mit Mapathon</p> <hr /> <div><br /> '''&gt;&gt; 11. Micro Mapping Party Rapperswil (&quot;OpenStreetMap Mapathon&quot;), Fr. 25. Oktober, 14:00-~21:00 &lt;&lt;'''<br /> '''&gt;&gt; mit Mapathon, Hackathon und AskMeAnything &lt;&lt;'''<br /> <br /> [[File:7_Mapping_Party_Rappi_Group_Photo_IMG_0563_640_480.jpg||205px|frameless|right|The crowd]]<br /> Das ist ein '''Mapathon''' und auch eine '''Mapping Party'''. Zudem kann man Fragen stellen zu OpenStreetMap ('''AskMeAnything'''!).<br /> <br /> * Freitag Fr. 25. Oktober<br /> * Wann/When? ab 14:00 Uhr / starting at 2:00 pm <br /> * Wo/Where? HSR Campus Gebäude 6 &quot;Seegebäude&quot;, Raum 6.011 (&lt;s&gt;6.002&lt;/s&gt;), / HSR campus building 6 &quot;by the lake&quot;, room 6.002 =&gt; '''[http://www.openstreetmap.org/node/2128316235 Karte/Map]/[http://www.hsr.ch/anfahrt Anfahrt/Venue]'''<br /> * Kontakt/Contact: Stefan sfkeller(at)hsr.ch<br /> <br /> '''Anmeldung/Registration: https://doodle.com/poll/kng963nkbg7869vs'''<br /> <br /> Der Mapathon dient dazu, Gebäude und Strassen etc. zu kartieren in Krisengebieten, wie beispielsweise Naturkatastrophen oder Gegenden mit medizinischer Unterversorgung (vgl. dieser [https://www.srf.ch/sendungen/10vor10/die-idee-open-street-map 10vor10-Bericht] und die [https://www.hotosm.org/ HOTOSM-Webseite]). Wahlweise kann man auch eine Micro Mapping Party daraus machen und nach draussen gehen und Rapperswil noch detaillierter erfassen als es schon ist... Egal, ob drinnen oder drausen: Es ist ein lockerer Event zum Erfassen von OpenStreetMap-Daten mit anschliessendem Editieren im PC-Labam - und Schluss wird Speis &amp; Trank geboten. <br /> <br /> Der Event ist für alle offen - von 16 bis 66 Jahren - insbesondere auch für Einsteiger/innen. Es werden über ein Dutzend Teilnehmer erwartet. / [en] The Micro Mapping Party is a casual outdoor event for capturing OpenStreetMap data with subsequent editing in the PC lab, followed by food &amp; drink. It is open to everyone - from 16 to 66 years - especially beginners. More than a dozen participants are expected.<br /> <br /> Verfolgt den Mapathon bzw. die Mapping Party auf / [en] Follow the mapathon or mapping party on [https://twitter.com/geometalab Twitter], [https://twitter.com/search?q=%23OpenStreetMap%20%23MappingParty Hashtags #OpenStreetMap, #MappingParty].<br /> <br /> == [de] Über / [en] About ==<br /> <br /> [de] Der Event ist auf englisch und deutsch; fast alle Teilnehmer können Englisch. Der Event ist kostenlos - es können Knabbersachen, Getränke und Dessert mitgebracht werden. / [en] The event is mainly held english but also in german; almost everbody here knows to speak english. The event has no fees, you can bring along chips, bewerage or sweets.<br /> <br /> * [de] Warum teilnehmen? Weil es Spass macht bei der grössten Karte der Welt mitmachen zu können und dazu noch mit Grillieren! / [en] Why participate? Because it's fun to participate at largest world wide map, and to barbecue. <br /> * [de] Was eine Mapping Party ist siehe / [en] Look here what a Mapping Party is '''[[5. Micro Mapping Party Rapperswil 2015|here]]''' oder/or [[OSM#Was_ist_OpenStreetMap?|here]].<br /> * [de] Was ist OpenStreetMap / [en] What is OpenStreetMap? see https://mamapa.org/lernen/openstreetmap<br /> * [de] Vergangene Parties / [en] Past parties: https://giswiki.hsr.ch/Kategorie:Mapping_Party<br /> * [de] Folge uns auf / Follow us on [http://twitter.com/geometalab Twitter]<br /> <br /> [de] Der Anlass entspricht anerkannten [https://wiki.osmfoundation.org/wiki/Directed_Editing_Policy Richtlinien ('Directed Editing Policy')]. / [en] This event is compliant with the [https://wiki.osmfoundation.org/wiki/Directed_Editing_Policy Richtlinien ('Directed Editing Policy')].<br /> <br /> == [de] Das Programm / [en] The Program ==<br /> <br /> Entwurf / EN: Tentative version:<br /> * 14:00 : Willkommen / Welcome (HSR Raum siehe oben)<br /> * 14:25 : Instructions: Intro to Mapping (Presentations)<br /> * 15:00 : Mapping (Outdoor) zu Fuss / EN: by foot (of tags like addresses and building-levels) in the area of Rapperswil<br /> * (15:00-17:00 session in parallel '''Mapathon/Hackathon''' und Ask me Anything, Stefan Keller)<br /> * 17:00 : Work on PC<br /> * 18:30 : Food &amp; Drinks<br /> * ~21:00: End<br /> <br /> Dieses Mal geht es v.a. um die gezielte Erfassung von Gebäudeadressen und -Höhen (Stockwerke). Es können auch Gebäude-Dachformen und Shop-Öffnungszeiten gemappt werden. / EN: This time we focus on building addresses and heights (building:levels). We can also map building roof shapes and opening hours of shops.<br /> <br /> == [de] Anmeldung / [en] Registration ==<br /> <br /> Registration: See header of this page.<br /> <br /> What to prepare:<br /> # Take along you laptop (if you have one, there will be free wifi); there are PC's available for those without own device.<br /> # Charge your mobile phone (if you have one), else there will be GPS there and field papers and buddies.<br /> # Take along power charger for laptop and/or phone (if you have one).<br /> # You can also bring along some food if you want (actually there's enough there).<br /> <br /> == [de] Wie mappen? [en] How to map? ==<br /> <br /> Changeset-comment: &quot;11. Micro Mapping Party Rapperswil 2019&quot;.<br /> <br /> * Adressen / Addresses: http://qa.poole.ch/addresses/ch (offiziell, aber leider nicht gepflegt: https://wiki.openstreetmap.org/wiki/Addresses)<br /> * Opening Hours: https://wiki.openstreetmap.org/wiki/DE:Key:opening_hours ev. &quot;check_date:opening_hours&quot;<br /> * Gebäude-Dachformen / Building Roof Types: [[7._Micro_Mapping_Party_Rapperswil_2016#How_to_tag_a_building.3F]]<br /> * 3D-Gebäude / 3D Buildings: http://geometalab.tumblr.com/post/154850095052/wie-rapperswil-mit-openstreetmap-zu-3d-wurde<br /> * Was fehlt? / What's missing?: [https://is-osm-uptodate.frafra.eu/#18/47.22626/8.81519 Is OSM Up-To-Date?]<br /> <br /> [[Kategorie:Mapping Party]] [[Kategorie:Mapathon]]</div> Das-g https://giswiki.hsr.ch/index.php?title=11._Micro_Mapping_Party_Rapperswil_2019&diff=67315 11. Micro Mapping Party Rapperswil 2019 2019-10-10T14:23:25Z <p>Das-g: Das-g verschob die Seite 11. Micro Mapping Party Rapperswil 2019 nach Mapathon &amp; Mapping Party Rapperswil 2019: Kein &quot;Micro&quot;, dafür verbunden mit Mapathon</p> <hr /> <div>#WEITERLEITUNG [[Mapathon &amp; Mapping Party Rapperswil 2019]]</div> Das-g https://giswiki.hsr.ch/index.php?title=11._Mapathon_%26_Mapping_Party_Rapperswil_2019&diff=67303 11. Mapathon & Mapping Party Rapperswil 2019 2019-10-09T11:40:30Z <p>Das-g: Clean-up-Absatz entfernt (ist diesmal nicht Teil der Mapping-Party)</p> <hr /> <div><br /> '''&gt;&gt; 11. Micro Mapping Party Rapperswil (&quot;OpenStreetMap Mapathon&quot;), Fr. 25. Oktober, 14:00-~21:00 &lt;&lt;'''<br /> '''&gt;&gt; mit Mapathon, Hackathon und AskMeAnything &lt;&lt;'''<br /> <br /> [[File:7_Mapping_Party_Rappi_Group_Photo_IMG_0563_640_480.jpg||205px|frameless|right|The crowd]]<br /> Das in die '''Mapping Party''' integrierte '''OSM-Treffen''' beinhaltet auch ein '''AskMeAnything'''! Der ebenfalls in die Mapping Party integrierte '''Micro Hackathon''' ist für diejenigen gedacht, die Daten vorbereiten oder Software entwickeln wollen. / [en] There's also an AskMeAnything session as well as a Micro Hackathon. <br /> <br /> * Freitag Fr. 25. Oktober<br /> * Wann/When? ab 14:00 Uhr / starting at 2:00 pm <br /> * Wo/Where? HSR Campus Gebäude 6 &quot;Seegebäude&quot;, Raum 6.011 (&lt;s&gt;6.002&lt;/s&gt;), / HSR campus building 6 &quot;by the lake&quot;, room 6.002 =&gt; '''[http://www.openstreetmap.org/node/2128316235 Karte/Map]/[http://www.hsr.ch/anfahrt Anfahrt/Venue]'''<br /> * Kontakt/Contact: Stefan sfkeller(at)hsr.ch<br /> <br /> '''Anmeldung/Registration: https://doodle.com/poll/kng963nkbg7869vs'''<br /> <br /> Die Micro Mapping Party ist ein lockerer Outdoor-Event zum Erfassen von OpenStreetMap-Daten mit anschliessendem Editieren im PC-Lab, gefolgt von Speis &amp; Trank. Sie ist für alle offen - von 16 bis 66 Jahren - insbesondere auch für Einsteiger/innen. Es werden über ein Dutzend Teilnehmer erwartet. / [en] The Micro Mapping Party is a casual outdoor event for capturing OpenStreetMap data with subsequent editing in the PC lab, followed by food &amp; drink. It is open to everyone - from 16 to 66 years - especially beginners. More than a dozen participants are expected.<br /> <br /> Verfolgt die Party auf / [en] Follow the party on [https://twitter.com/SwissOSM Twitter], [https://twitter.com/search?q=%23OpenStreetMap%20%23MappingParty Hashtags #OpenStreetMap, #MappingParty].<br /> <br /> == [de] Über / [en] About ==<br /> <br /> [de] Der Event ist auf englisch und deutsch; fast alle Teilnehmer können Englisch. Der Event ist kostenlos - es können Knabbersachen, Getränke und Dessert mitgebracht werden. / [en] The event is mainly held english but also in german; almost everbody here knows to speak english. The event has no fees, you can bring along chips, bewerage or sweets.<br /> <br /> * [de] Warum teilnehmen? Weil es Spass macht bei der grössten Karte der Welt mitmachen zu können und dazu noch mit Grillieren! / [en] Why participate? Because it's fun to participate at largest world wide map, and to barbecue. <br /> * [de] Was eine Mapping Party ist siehe / [en] Look here what a Mapping Party is '''[[5. Micro Mapping Party Rapperswil 2015|here]]''' oder/or [[OSM#Was_ist_OpenStreetMap?|here]].<br /> * [de] Was ist OpenStreetMap / [en] What is OpenStreetMap? see https://mamapa.org/lernen/openstreetmap<br /> * [de] Vergangene Parties / [en] Past parties: https://giswiki.hsr.ch/Kategorie:Mapping_Party<br /> * [de] Folge uns auf / Follow us on [http://twitter.com/geometalab Twitter]<br /> <br /> [de] Der Anlass entspricht anerkannten [https://wiki.osmfoundation.org/wiki/Directed_Editing_Policy Richtlinien ('Directed Editing Policy')]. / [en] This event is compliant with the [https://wiki.osmfoundation.org/wiki/Directed_Editing_Policy Richtlinien ('Directed Editing Policy')].<br /> <br /> == [de] Das Programm / [en] The Program ==<br /> <br /> Entwurf / EN: Tentative version:<br /> * 14:00 : Willkommen / Welcome (HSR Raum siehe oben)<br /> * 14:25 : Instructions: Intro to Mapping (Presentations)<br /> * 15:00 : Mapping (Outdoor) zu Fuss / EN: by foot (of tags like addresses and building-levels) in the area of Rapperswil<br /> * (15:00-17:00 session in parallel '''Mapathon/Hackathon''' und Ask me Anything, Stefan Keller)<br /> * 17:00 : Work on PC<br /> * 18:30 : Food &amp; Drinks<br /> * ~21:00: End<br /> <br /> Dieses Mal geht es v.a. um die gezielte Erfassung von Gebäudeadressen und -Höhen (Stockwerke). Es können auch Gebäude-Dachformen und Shop-Öffnungszeiten gemappt werden. / EN: This time we focus on building addresses and heights (building:levels). We can also map building roof shapes and opening hours of shops.<br /> <br /> == [de] Anmeldung / [en] Registration ==<br /> <br /> Registration: See header of this page.<br /> <br /> What to prepare:<br /> # Take along you laptop (if you have one, there will be free wifi); there are PC's available for those without own device.<br /> # Charge your mobile phone (if you have one), else there will be GPS there and field papers and buddies.<br /> # Take along power charger for laptop and/or phone (if you have one).<br /> # You can also bring along some food if you want (actually there's enough there).<br /> <br /> == [de] Wie mappen? [en] How to map? ==<br /> <br /> Changeset-comment: &quot;11. Micro Mapping Party Rapperswil 2019&quot;.<br /> <br /> * Adressen / Addresses: http://qa.poole.ch/addresses/ch (offiziell, aber leider nicht gepflegt: https://wiki.openstreetmap.org/wiki/Addresses)<br /> * Opening Hours: https://wiki.openstreetmap.org/wiki/DE:Key:opening_hours ev. &quot;check_date:opening_hours&quot;<br /> * Gebäude-Dachformen / Building Roof Types: [[7._Micro_Mapping_Party_Rapperswil_2016#How_to_tag_a_building.3F]]<br /> * 3D-Gebäude / 3D Buildings: http://geometalab.tumblr.com/post/154850095052/wie-rapperswil-mit-openstreetmap-zu-3d-wurde<br /> * Was fehlt? / What's missing?: [https://is-osm-uptodate.frafra.eu/#18/47.22626/8.81519 Is OSM Up-To-Date?]<br /> <br /> [[Kategorie:Mapping Party]]</div> Das-g https://giswiki.hsr.ch/index.php?title=11._Mapathon_%26_Mapping_Party_Rapperswil_2019&diff=67299 11. Mapathon & Mapping Party Rapperswil 2019 2019-10-08T21:00:38Z <p>Das-g: Bei der 10. Mapping-Party war die Kombination mit Müll-Einsammel-Aktion evtl. noch neu, bei der 11. kann es dann aber nicht mehr das 1. Mal sein ...</p> <hr /> <div><br /> '''&gt;&gt; 11. Micro Mapping Party Rapperswil (&quot;OpenStreetMap Mapathon&quot;), Fr. 25. Oktober, 14:00-~21:00 &lt;&lt;'''<br /> '''&gt;&gt; mit Mapathon, Hackathon und AskMeAnything &lt;&lt;'''<br /> <br /> [[File:7_Mapping_Party_Rappi_Group_Photo_IMG_0563_640_480.jpg||205px|frameless|right|The crowd]]<br /> Das in die '''Mapping Party''' integrierte '''OSM-Treffen''' beinhaltet auch ein '''AskMeAnything'''! Der ebenfalls in die Mapping Party integrierte '''Micro Hackathon''' ist für diejenigen gedacht, die Daten vorbereiten oder Software entwickeln wollen. / [en] There's also an AskMeAnything session as well as a Micro Hackathon. <br /> <br /> * Freitag Fr. 25. Oktober<br /> * Wann/When? ab 14:00 Uhr / starting at 2:00 pm <br /> * Wo/Where? HSR Campus Gebäude 6 &quot;Seegebäude&quot;, Raum 6.011 (&lt;s&gt;6.002&lt;/s&gt;), / HSR campus building 6 &quot;by the lake&quot;, room 6.002 =&gt; '''[http://www.openstreetmap.org/node/2128316235 Karte/Map]/[http://www.hsr.ch/anfahrt Anfahrt/Venue]'''<br /> * Kontakt/Contact: Stefan sfkeller(at)hsr.ch<br /> <br /> '''Anmeldung/Registration: https://doodle.com/poll/kng963nkbg7869vs'''<br /> <br /> Die Micro Mapping Party ist ein lockerer Outdoor-Event zum Erfassen von OpenStreetMap-Daten mit anschliessendem Editieren im PC-Lab, gefolgt von Speis &amp; Trank. Sie ist für alle offen - von 16 bis 66 Jahren - insbesondere auch für Einsteiger/innen. Es werden über ein Dutzend Teilnehmer erwartet. / [en] The Micro Mapping Party is a casual outdoor event for capturing OpenStreetMap data with subsequent editing in the PC lab, followed by food &amp; drink. It is open to everyone - from 16 to 66 years - especially beginners. More than a dozen participants are expected.<br /> <br /> Gleichzeitig während des Kartierens verbessern wir die Aussenumgebung und säubern herumliegende Abfälle. / [en] At the same time while mapping we improve outdoor environments and clean up litter.<br /> <br /> Verfolgt die Party auf / [en] Follow the party on [https://twitter.com/SwissOSM Twitter], [https://twitter.com/search?q=%23OpenStreetMap%20%23MappingParty Hashtags #OpenStreetMap, #MappingParty].<br /> <br /> == [de] Über / [en] About ==<br /> <br /> [de] Der Event ist auf englisch und deutsch; fast alle Teilnehmer können Englisch. Der Event ist kostenlos - es können Knabbersachen, Getränke und Dessert mitgebracht werden. / [en] The event is mainly held english but also in german; almost everbody here knows to speak english. The event has no fees, you can bring along chips, bewerage or sweets.<br /> <br /> * [de] Warum teilnehmen? Weil es Spass macht bei der grössten Karte der Welt mitmachen zu können und dazu noch mit Grillieren! / [en] Why participate? Because it's fun to participate at largest world wide map, and to barbecue. <br /> * [de] Was eine Mapping Party ist siehe / [en] Look here what a Mapping Party is '''[[5. Micro Mapping Party Rapperswil 2015|here]]''' oder/or [[OSM#Was_ist_OpenStreetMap?|here]].<br /> * [de] Was ist OpenStreetMap / [en] What is OpenStreetMap? see https://mamapa.org/lernen/openstreetmap<br /> * [de] Vergangene Parties / [en] Past parties: https://giswiki.hsr.ch/Kategorie:Mapping_Party<br /> * [de] Folge uns auf / Follow us on [http://twitter.com/geometalab Twitter]<br /> <br /> [de] Der Anlass entspricht anerkannten [https://wiki.osmfoundation.org/wiki/Directed_Editing_Policy Richtlinien ('Directed Editing Policy')]. / [en] This event is compliant with the [https://wiki.osmfoundation.org/wiki/Directed_Editing_Policy Richtlinien ('Directed Editing Policy')].<br /> <br /> == [de] Das Programm / [en] The Program ==<br /> <br /> Entwurf / EN: Tentative version:<br /> * 14:00 : Willkommen / Welcome (HSR Raum siehe oben)<br /> * 14:25 : Instructions: Intro to Mapping (Presentations)<br /> * 15:00 : Mapping (Outdoor) zu Fuss / EN: by foot (of tags like addresses and building-levels) in the area of Rapperswil<br /> * (15:00-17:00 session in parallel '''Mapathon/Hackathon''' und Ask me Anything, Stefan Keller)<br /> * 17:00 : Work on PC<br /> * 18:30 : Food &amp; Drinks<br /> * ~21:00: End<br /> <br /> Dieses Mal geht es v.a. um die gezielte Erfassung von Gebäudeadressen und -Höhen (Stockwerke). Es können auch Gebäude-Dachformen und Shop-Öffnungszeiten gemappt werden. / EN: This time we focus on building addresses and heights (building:levels). We can also map building roof shapes and opening hours of shops.<br /> <br /> == [de] Anmeldung / [en] Registration ==<br /> <br /> Registration: See header of this page.<br /> <br /> What to prepare:<br /> # Take along you laptop (if you have one, there will be free wifi); there are PC's available for those without own device.<br /> # Charge your mobile phone (if you have one), else there will be GPS there and field papers and buddies.<br /> # Take along power charger for laptop and/or phone (if you have one).<br /> # You can also bring along some food if you want (actually there's enough there).<br /> <br /> == [de] Wie mappen? [en] How to map? ==<br /> <br /> Changeset-comment: &quot;11. Micro Mapping Party Rapperswil 2019&quot;.<br /> <br /> * Adressen / Addresses: http://qa.poole.ch/addresses/ch (offiziell, aber leider nicht gepflegt: https://wiki.openstreetmap.org/wiki/Addresses)<br /> * Opening Hours: https://wiki.openstreetmap.org/wiki/DE:Key:opening_hours ev. &quot;check_date:opening_hours&quot;<br /> * Gebäude-Dachformen / Building Roof Types: [[7._Micro_Mapping_Party_Rapperswil_2016#How_to_tag_a_building.3F]]<br /> * 3D-Gebäude / 3D Buildings: http://geometalab.tumblr.com/post/154850095052/wie-rapperswil-mit-openstreetmap-zu-3d-wurde<br /> * Was fehlt? / What's missing?: [https://is-osm-uptodate.frafra.eu/#18/47.22626/8.81519 Is OSM Up-To-Date?]<br /> <br /> [[Kategorie:Mapping Party]]</div> Das-g https://giswiki.hsr.ch/index.php?title=11._Mapathon_%26_Mapping_Party_Rapperswil_2019&diff=67291 11. Mapathon & Mapping Party Rapperswil 2019 2019-10-03T17:07:42Z <p>Das-g: Anmelde-Link</p> <hr /> <div><br /> '''&gt;&gt; Micro Mapping Party Rapperswil (&quot;OpenStreetMap-Mapathon&quot;), Fr. 25. Oktober, 14:00-~21:00 &lt;&lt;'''<br /> '''&gt;&gt; mit Mapathon, Hackathon und AskMeAnything &lt;&lt;'''<br /> <br /> [[File:7_Mapping_Party_Rappi_Group_Photo_IMG_0563_640_480.jpg||205px|frameless|right|The crowd]]<br /> Das in die '''Mapping Party''' integrierte '''OSM-Treffen''' beinhaltet auch ein '''AskMeAnything'''! Der ebenfalls in die Mapping Party integrierte '''Micro Hackathon''' ist für diejenigen gedacht, die Daten vorbereiten oder Software entwickeln wollen. / [en] There's also an AskMeAnything session as well as a Micro Hackathon. <br /> <br /> * Freitag Fr. 25. Oktober<br /> * Wann/When? ab 14:00 Uhr / starting at 2:00 pm <br /> * Wo/Where? HSR Campus Gebäude 6 &quot;Seegebäude&quot;, Raum 6.011 (&lt;s&gt;6.002&lt;/s&gt;), / HSR campus building 6 &quot;by the lake&quot;, room 6.002 =&gt; '''[http://www.openstreetmap.org/node/2128316235 Karte/Map]/[http://www.hsr.ch/anfahrt Anfahrt/Venue]'''<br /> * Kontakt/Contact: Stefan sfkeller(at)hsr.ch<br /> <br /> '''Anmeldung/Registration: https://doodle.com/poll/kng963nkbg7869vs'''<br /> <br /> Die Micro Mapping Party ist ein lockerer Outdoor-Event zum Erfassen von OpenStreetMap-Daten mit anschliessendem Editieren im PC-Lab, gefolgt von Speis &amp; Trank. Sie ist für alle offen - von 16 bis 66 Jahren - insbesondere auch für Einsteiger/innen. Es werden über ein Dutzend Teilnehmer erwartet. / [en] The Micro Mapping Party is a casual outdoor event for capturing OpenStreetMap data with subsequent editing in the PC lab, followed by food &amp; drink. It is open to everyone - from 16 to 66 years - especially beginners. More than a dozen participants are expected.<br /> <br /> Gleichzeitig während des Kartierens (und wahrscheinlich zum ersten Mal weltweit) verbessern wir die Aussenumgebung und säubern herumliegende Abfälle. / [en] At the same time while mapping (and probably for the first time worldwide?) we improve outdoor environments and clean up litter.<br /> <br /> Verfolgt die Party auf / [en] Follow the party on [https://twitter.com/SwissOSM Twitter], [https://twitter.com/search?q=%23OpenStreetMap%20%23MappingParty Hashtags #OpenStreetMap, #MappingParty].<br /> <br /> == [de] Über / [en] About ==<br /> <br /> [de] Der Event ist auf englisch und deutsch; fast alle Teilnehmer können Englisch. Der Event ist kostenlos - es können Knabbersachen, Getränke und Dessert mitgebracht werden. / [en] The event is mainly held english but also in german; almost everbody here knows to speak english. The event has no fees, you can bring along chips, bewerage or sweets.<br /> <br /> * [de] Warum teilnehmen? Weil es Spass macht bei der grössten Karte der Welt mitmachen zu können und dazu noch mit Grillieren! / [en] Why participate? Because it's fun to participate at largest world wide map, and to barbecue. <br /> * [de] Was eine Mapping Party ist siehe / [en] Look here what a Mapping Party is '''[[5. Micro Mapping Party Rapperswil 2015|here]]''' oder/or [[OSM#Was_ist_OpenStreetMap?|here]].<br /> * [de] Was ist OpenStreetMap / [en] What is OpenStreetMap? see https://mamapa.org/lernen/openstreetmap<br /> * [de] Vergangene Parties / [en] Past parties: https://giswiki.hsr.ch/Kategorie:Mapping_Party<br /> * [de] Folge uns auf / Follow us on [http://twitter.com/geometalab Twitter]<br /> <br /> [de] Der Anlass entspricht anerkannten [https://wiki.osmfoundation.org/wiki/Directed_Editing_Policy Richtlinien ('Directed Editing Policy')]. / [en] This event is compliant with the [https://wiki.osmfoundation.org/wiki/Directed_Editing_Policy Richtlinien ('Directed Editing Policy')].<br /> <br /> == [de] Das Programm / [en] The Program ==<br /> <br /> Entwurf / EN: Tentative version:<br /> * 14:00 : Willkommen / Welcome (HSR Raum siehe oben)<br /> * 14:25 : Instructions: Intro to Mapping (Presentations)<br /> * 15:00 : Mapping (Outdoor) zu Fuss / EN: by foot (of tags like addresses and building-levels) in the area of Rapperswil<br /> * (15:00-17:00 session in parallel '''Mapathon/Hackathon''' und Ask me Anything, Stefan Keller)<br /> * 17:00 : Work on PC<br /> * 18:30 : Food &amp; Drinks<br /> * ~21:00: End<br /> <br /> Dieses Mal geht es v.a. um die gezielte Erfassung von Gebäudeadressen und -Höhen (Stockwerke). Es können auch Gebäude-Dachformen und Shop-Öffnungszeiten gemappt werden. / EN: This time we focus on building addresses and heights (building:levels). We can also map building roof shapes and opening hours of shops.<br /> <br /> == [de] Anmeldung / [en] Registration ==<br /> <br /> Registration: See header of this page.<br /> <br /> What to prepare:<br /> # Take along you laptop (if you have one, there will be free wifi); there are PC's available for those without own device.<br /> # Charge your mobile phone (if you have one), else there will be GPS there and field papers and buddies.<br /> # Take along power charger for laptop and/or phone (if you have one).<br /> # You can also bring along some food if you want (actually there's enough there).<br /> <br /> == [de] Wie mappen? [en] How to map? ==<br /> <br /> Changeset-comment: &quot;11. Micro Mapping Party Rapperswil 2019&quot;.<br /> <br /> * Adressen / Addresses: http://qa.poole.ch/addresses/ch (offiziell, aber leider nicht gepflegt: https://wiki.openstreetmap.org/wiki/Addresses)<br /> * Opening Hours: https://wiki.openstreetmap.org/wiki/DE:Key:opening_hours ev. &quot;check_date:opening_hours&quot;<br /> * Gebäude-Dachformen / Building Roof Types: [[7._Micro_Mapping_Party_Rapperswil_2016#How_to_tag_a_building.3F]]<br /> * 3D-Gebäude / 3D Buildings: http://geometalab.tumblr.com/post/154850095052/wie-rapperswil-mit-openstreetmap-zu-3d-wurde<br /> * Was fehlt? / What's missing?: [https://is-osm-uptodate.frafra.eu/#18/47.22626/8.81519 Is OSM Up-To-Date?]<br /> <br /> [[Kategorie:Mapping Party]]</div> Das-g https://giswiki.hsr.ch/index.php?title=11._Mapathon_%26_Mapping_Party_Rapperswil_2019&diff=67290 11. Mapathon & Mapping Party Rapperswil 2019 2019-10-03T15:11:45Z <p>Das-g: Datum steht fest</p> <hr /> <div><br /> '''&gt;&gt; Micro Mapping Party Rapperswil (&quot;OpenStreetMap-Mapathon&quot;), Fr. 25. Oktober, 14:00-~21:00 &lt;&lt;'''<br /> '''&gt;&gt; mit Mapathon, Hackathon und AskMeAnything &lt;&lt;'''<br /> <br /> [[File:7_Mapping_Party_Rappi_Group_Photo_IMG_0563_640_480.jpg||205px|frameless|right|The crowd]]<br /> Das in die '''Mapping Party''' integrierte '''OSM-Treffen''' beinhaltet auch ein '''AskMeAnything'''! Der ebenfalls in die Mapping Party integrierte '''Micro Hackathon''' ist für diejenigen gedacht, die Daten vorbereiten oder Software entwickeln wollen. / [en] There's also an AskMeAnything session as well as a Micro Hackathon. <br /> <br /> * Freitag Fr. 25. Oktober<br /> * Wann/When? ab 14:00 Uhr / starting at 2:00 pm <br /> * Wo/Where? HSR Campus Gebäude 6 &quot;Seegebäude&quot;, Raum 6.011 (&lt;s&gt;6.002&lt;/s&gt;), / HSR campus building 6 &quot;by the lake&quot;, room 6.002 =&gt; '''[http://www.openstreetmap.org/node/2128316235 Karte/Map]/[http://www.hsr.ch/anfahrt Anfahrt/Venue]'''<br /> * Kontakt/Contact: Stefan sfkeller(at)hsr.ch<br /> <br /> '''Anmeldung/Registration: to be announced'''<br /> <br /> Die Micro Mapping Party ist ein lockerer Outdoor-Event zum Erfassen von OpenStreetMap-Daten mit anschliessendem Editieren im PC-Lab, gefolgt von Speis &amp; Trank. Sie ist für alle offen - von 16 bis 66 Jahren - insbesondere auch für Einsteiger/innen. Es werden über ein Dutzend Teilnehmer erwartet. / [en] The Micro Mapping Party is a casual outdoor event for capturing OpenStreetMap data with subsequent editing in the PC lab, followed by food &amp; drink. It is open to everyone - from 16 to 66 years - especially beginners. More than a dozen participants are expected.<br /> <br /> Gleichzeitig während des Kartierens (und wahrscheinlich zum ersten Mal weltweit) verbessern wir die Aussenumgebung und säubern herumliegende Abfälle. / [en] At the same time while mapping (and probably for the first time worldwide?) we improve outdoor environments and clean up litter.<br /> <br /> Verfolgt die Party auf / [en] Follow the party on [https://twitter.com/SwissOSM Twitter], [https://twitter.com/search?q=%23OpenStreetMap%20%23MappingParty Hashtags #OpenStreetMap, #MappingParty].<br /> <br /> == [de] Über / [en] About ==<br /> <br /> [de] Der Event ist auf englisch und deutsch; fast alle Teilnehmer können Englisch. Der Event ist kostenlos - es können Knabbersachen, Getränke und Dessert mitgebracht werden. / [en] The event is mainly held english but also in german; almost everbody here knows to speak english. The event has no fees, you can bring along chips, bewerage or sweets.<br /> <br /> * [de] Warum teilnehmen? Weil es Spass macht bei der grössten Karte der Welt mitmachen zu können und dazu noch mit Grillieren! / [en] Why participate? Because it's fun to participate at largest world wide map, and to barbecue. <br /> * [de] Was eine Mapping Party ist siehe / [en] Look here what a Mapping Party is '''[[5. Micro Mapping Party Rapperswil 2015|here]]''' oder/or [[OSM#Was_ist_OpenStreetMap?|here]].<br /> * [de] Was ist OpenStreetMap / [en] What is OpenStreetMap? see https://mamapa.org/lernen/openstreetmap<br /> * [de] Vergangene Parties / [en] Past parties: https://giswiki.hsr.ch/Kategorie:Mapping_Party<br /> * [de] Folge uns auf / Follow us on [http://twitter.com/geometalab Twitter]<br /> <br /> [de] Der Anlass entspricht anerkannten [https://wiki.osmfoundation.org/wiki/Directed_Editing_Policy Richtlinien ('Directed Editing Policy')]. / [en] This event is compliant with the [https://wiki.osmfoundation.org/wiki/Directed_Editing_Policy Richtlinien ('Directed Editing Policy')].<br /> <br /> == [de] Das Programm / [en] The Program ==<br /> <br /> Entwurf / EN: Tentative version:<br /> * 14:00 : Willkommen / Welcome (HSR Raum siehe oben)<br /> * 14:25 : Instructions: Intro to Mapping (Presentations)<br /> * 15:00 : Mapping (Outdoor) zu Fuss / EN: by foot (of tags like addresses and building-levels) in the area of Rapperswil<br /> * (15:00-17:00 session in parallel '''Mapathon/Hackathon''' und Ask me Anything, Stefan Keller)<br /> * 17:00 : Work on PC<br /> * 18:30 : Food &amp; Drinks<br /> * ~21:00: End<br /> <br /> Dieses Mal geht es v.a. um die gezielte Erfassung von Gebäudeadressen und -Höhen (Stockwerke). Es können auch Gebäude-Dachformen und Shop-Öffnungszeiten gemappt werden. / EN: This time we focus on building addresses and heights (building:levels). We can also map building roof shapes and opening hours of shops.<br /> <br /> == [de] Anmeldung / [en] Registration ==<br /> <br /> Registration: See header of this page.<br /> <br /> What to prepare:<br /> # Take along you laptop (if you have one, there will be free wifi); there are PC's available for those without own device.<br /> # Charge your mobile phone (if you have one), else there will be GPS there and field papers and buddies.<br /> # Take along power charger for laptop and/or phone (if you have one).<br /> # You can also bring along some food if you want (actually there's enough there).<br /> <br /> == [de] Wie mappen? [en] How to map? ==<br /> <br /> Changeset-comment: &quot;11. Micro Mapping Party Rapperswil 2019&quot;.<br /> <br /> * Adressen / Addresses: http://qa.poole.ch/addresses/ch (offiziell, aber leider nicht gepflegt: https://wiki.openstreetmap.org/wiki/Addresses)<br /> * Opening Hours: https://wiki.openstreetmap.org/wiki/DE:Key:opening_hours ev. &quot;check_date:opening_hours&quot;<br /> * Gebäude-Dachformen / Building Roof Types: [[7._Micro_Mapping_Party_Rapperswil_2016#How_to_tag_a_building.3F]]<br /> * 3D-Gebäude / 3D Buildings: http://geometalab.tumblr.com/post/154850095052/wie-rapperswil-mit-openstreetmap-zu-3d-wurde<br /> * Was fehlt? / What's missing?: [https://is-osm-uptodate.frafra.eu/#18/47.22626/8.81519 Is OSM Up-To-Date?]<br /> <br /> [[Kategorie:Mapping Party]]</div> Das-g https://giswiki.hsr.ch/index.php?title=Diskussion:10._Micro_Mapping_Party_Rapperswil_2018&diff=64215 Diskussion:10. Micro Mapping Party Rapperswil 2018 2018-08-17T12:41:18Z <p>Das-g: Weitere Teilnehmer</p> <hr /> <div>Teilnehmer:<br /> # Raphael Das Gupta, HSR IFS, Organizer<br /> # Stefan Keller, HSR IFS Co-Organizer<br /> # Benjamin Seemann, IMS<br /> # Alejandro Gloor, IMS<br /> # Mario Meili, IFS<br /> # Ang Kok Jun Keith, NTU<br /> # Bryan Chua, NTU<br /> # Sathesh, NTU<br /> # Muhaimin Mareum Khan, NTU<br /> # Fang Quan Chia, NTU<br /> # Jordan Loo, NTU<br /> # Adriel Chan, NTU<br /> # m. spreng, OSM<br /> # Patrick Stählin, OSM (later)<br /> # Manfred, OSM<br /> # Lukas Toggenburger, OSM<br /> # Simon Poole, OSM<br /> # Loremo, OSM<br /> # Ulrich, OSM<br /> # Mark, OSM<br /> # Philip Hänggi, ?<br /> <br /> <br /> == Hackathon - Daten ==<br /> <br /> * Hotels St. Moritz<br /> * Bern?<br /> * others?<br /> <br /> == Hackathon - Software ==<br /> <br /> Einführung in OSM APIs: https://towardsdatascience.com/loading-data-from-openstreetmap-with-python-and-the-overpass-api-513882a27fd0<br /> <br /> == Notizen ==<br /> <br /> ...</div> Das-g https://giswiki.hsr.ch/index.php?title=Portable_QGIS&diff=64085 Portable QGIS 2018-06-25T13:45:33Z <p>Das-g: /* Portable QGIS for Schools */</p> <hr /> <div>The goal of a GIS/[[QGIS]] portable edition is to provide students and beginners with a ready-installed and configured software that would run in Windows (or Mac or Linux) without the need for emulation or a live CD.<br /> <br /> &gt;&gt; We currently recommend &quot;Portable GIS (incl. QGIS)&quot; &lt;&lt; <br /> <br /> German: Siehe auch [[QGIS-Materialien]] und [[QGIS im Geographieunterricht#QGIS_Portable]]<br /> <br /> == Portable GIS ==<br /> <br /> * &quot;Portable GIS&quot; is a windows-only set of open source GIS packages ready to install or copy onto a USB stick, and run with no additional configuration. <br /> * Download: https://portablegis.xyz/ (June 2017, containing QGIS version 2.18.11 LTR)<br /> <br /> == Portable QGIS for Schools ==<br /> <br /> * Minimalistic pre-configured QGIS 3 for [http://www.lernstick.ch Lernstick].<br /> * Contains lesser Icons/GUI but also plugins like QuickMapServices und Vector Tiles Reader.<br /> * To be announced.<br /> <br /> == Older Portable QGIS Editions ==<br /> <br /> &quot;Portable QGIS Swiss Edition&quot; by Sourcepole:<br /> * Issue date: around March 2016 (Outdated!)<br /> * Software included: QGIS 2.14, GDAL 2.x, Interlis-Plugin<br /> * Operating System: Windows, running without installation (also on USB sticks)<br /> * '''[http://www.sourcepole.ch/produkte/interlis/ Download Site]''' (135 MB) by Sourcepole.ch<br /> <br /> &quot;Portable GIS&quot; by Archaeogeek: <br /> * See http://www.archaeogeek.com/portable-gis.html (Apr 19th, 2016 u.a. with QGIS 2.14.1) <br /> <br /> &quot;QGIS Portable&quot; by Piemonte/IT: <br /> * QGIS Version 2.6.1, deutsch, mit Daten von Piemont. [http://webgis.arpa.piemonte.it/geoportale/index.php/documentazione/manuali-e-strumenti/accesso-con-qgis/100-quantum-gis-qgis]<br /> <br /> Notes:<br /> * 2014 gab es die Idee, ein &quot;QGIS Portable für Schulen (deutsch)&quot; zu erstellen, passend zu Windows 32bit, 64bit, Mac (Linux nicht notwendig).<br /> <br /> [[Kategorie:QGIS]] [[Kategorie:E-Learning]]</div> Das-g https://giswiki.hsr.ch/index.php?title=Web_Map_Tile_Service&diff=63956 Web Map Tile Service 2018-03-05T15:24:04Z <p>Das-g: /* Mit xmllint (libxml) */ Grammatik: Komma eingefügt</p> <hr /> <div>Der [[OGC]]-Standard '''Web Map Tile Service (WMTS)''' ([http://www.opengeospatial.org/standards/wmts offizielle Website mit Versionen], [http://portal.opengeospatial.org/files/?artifact_id=35326 PDF v1.0.0]) ist eine von [[Web Map Tiling#Spezifikationen|mehreren Konventionen]] um Rasterkarten als (potenziell vor-berechnete &amp; vor-gerenderte) Kachelsammlung anzubieten.<br /> <br /> Siehe auch Wikipedia ([https://en.wikipedia.org/wiki/Web_Map_Tile_Service en]|[https://de.wikipedia.org/wiki/Web_Map_Tile_Service de]).<br /> <br /> == Verwendung ==<br /> <br /> === Einbinden auf SwissTopo-Webkarte ===<br /> <br /> # Gehe auf https://map.geo.admin.ch/<br /> # Unter &quot;Advanced Tools&quot; (de: &quot;Erweiterte Werkzeuge&quot;), klicke &quot;Import&quot; (de: &quot;Importieren&quot;)<br /> # Gib die URL zur &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt;-Datei an<br /> # Klicke &quot;Connect&quot; (de: &quot;Verbinden&quot;)&lt;br /&gt;Die Liste der verfügbaren Layer des WMTS wird angezeigt. Durch Hovern über dem jeweiligen Listeneintrag wird eine Vorschau im Hintergrund geladen.<br /> # Für jeden gewünschten Layer:<br /> ## Wähle (durch Anklicken) den gewünschten WMTS-Layer aus der angezeigten Liste<br /> ## Füll wahlweise das Feld &quot;Description&quot; (de: &quot;Beschreibung&quot; aus) '''(optional)'''<br /> ## Klicke &quot;Add Layer&quot; (de: &quot;Layer Hinzufügen&quot;)<br /> <br /> <br /> === Einbinden in QGIS ===<br /> <br /> # Menü &quot;Layer&quot; &gt; &quot;Add Layer&quot; &gt; &quot;Add WMS/WMTS Layer...&quot; oder &lt;kbd&gt;Ctrl&lt;/kbd&gt;-&lt;kbd&gt;Shift&lt;/kbd&gt;-&lt;kbd&gt;W&lt;/kbd&gt;<br /> # Button &quot;New&quot;<br /> # Feld &quot;Name&quot; beliebig ausfüllen<br /> # In Feld &quot;URL&quot; die URL zur &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt;-Datei angeben<br /> # Button &quot;OK&quot;<br /> # Button &quot;Connect&quot;&lt;br /&gt;Die Liste der verfügbaren Layer des WMTS wird angezeigt.<br /> # Für jeden gewünschten Layer:<br /> ## Wähle (durch Anklicken) den gewünschten WMTS-Layer aus der angezeigten Liste<br /> ## Klicke Button &quot;Add&quot;<br /> # Klicke Button &quot;Close&quot;<br /> <br /> == Begrenzungen ==<br /> <br /> {| class=&quot;wikitable&quot;<br /> |-<br /> ! Position im XML-Baum (XPath)<br /> ! begrenzt<br /> ! mittels<br /> ! Minimalbeispiel<br /> ! Maximalbeispiel<br /> |-<br /> | &lt;code&gt;//Layer/ows:BoundingBox&lt;/code&gt;<br /> |<br /> das '''dargestellte Datenset'''<br /> des Layers<br /> <br /> (informativ;<br /> Tiles können auch ausserhalb verfügbar sein, stellen dort aber keine Daten dar)<br /> | Koordinaten im CRS des Layers<br /> | &lt;pre&gt;<br /> &lt;ows:BoundingBox&gt;<br /> &lt;ows:LowerCorner&gt;420000 30000&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;900000 350000&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:BoundingBox&gt;<br /> &lt;/pre&gt;<br /> | &lt;pre&gt;<br /> &lt;ows:BoundingBox crs=&quot;urn:ogc:def:crs:EPSG:6.3:21781&quot; dimensions=&quot;2&quot;&gt;<br /> &lt;ows:LowerCorner&gt;420000.000000 30000.000000&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;900000.000000 350000.000000&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:BoundingBox&gt;<br /> &lt;/pre&gt;<br /> |-<br /> | &lt;code&gt;//Layer/WGS84BoundingBox&lt;/code&gt;<br /> |<br /> das '''dargestellte Datenset'''<br /> des Layers<br /> <br /> (informativ;<br /> Tiles können auch ausserhalb verfügbar sein, stellen dort aber keine Daten dar)<br /> | dezimalen WGS84-Koordinaten (lon-lat: Längengrad vor Breitengrad)<br /> | &lt;pre&gt;<br /> &lt;ows:WGS84BoundingBox&gt;<br /> &lt;ows:LowerCorner&gt;-180 -85.05112878&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;180 85.05112878&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:WGS84BoundingBox&gt;<br /> &lt;/pre&gt;<br /> | &lt;pre&gt;<br /> &lt;ows:WGS84BoundingBox crs=&quot;urn:ogc:def:crs:OGC:2:84&quot; dimensions=&quot;2&quot;&gt;<br /> &lt;ows:LowerCorner&gt;-180.0 -85.05112877980659237838&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;180.0 85.05112877980659237838&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:WGS84BoundingBox&gt;<br /> &lt;/pre&gt;<br /> |-<br /> | &lt;code&gt;//Layer/TileMatrixSetLink/TileMatrixSetLimits/TileMatrixLimits&lt;/code&gt;<br /> |<br /> die '''abrufbaren Tiles'''<br /> des Layers<br /> für diese TileMatrix innerhalb des verlinken TileMatrixSets<br /> <br /> (normativ;<br /> Anfrage ausserhalb sollte zu &lt;code&gt;TileOutOfRange&lt;/code&gt;-Exception bzw. HTTP-Status-Code &lt;code&gt;400&lt;/code&gt; &lt;code&gt;Bad Request&lt;/code&gt; führen)<br /> | Tile-Indices<br /> | &lt;!-- TODO: Minimalbeispiel --&gt;<br /> | &lt;!-- TODO: Maximalbeispiel --&gt;<br /> |-<br /> | &lt;code&gt;//TileMatrixSet/BoundingBox&lt;/code&gt;<br /> |<br /> den '''Definitionsbereich''' des TileMatrixSets<br /> und damit<br /> die '''potentiell abrufbaren Tiles'''<br /> aller aktuellen ''und künftigen'' Layers,<br /> die dieses Set verwenden<br /> | Koordinaten im CRS des TileMatrixSets<br /> | &lt;!-- TODO: Minimalbeispiel --&gt;<br /> | &lt;!-- TODO: Maximalbeispiel --&gt;<br /> |-<br /> |}<br /> <br /> == XYZ &amp;rarr; WMTS ==<br /> <br /> Hat man bereits einen nach XYZ-Konvention im Web verfügbaren Kachel-Satz, so lässt sich aus diesem ein (RESTful) WTMS machen, in dem man eine passende (statische) ServiceMetadata-XML-Datei &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt; serviert.<br /> <br /> === Beispiel ===<br /> <br /> Kacheln von osm.ch als WMTS Konfig.-Datei:<br /> https://gist.githubusercontent.com/das-g/882334b2844d5cdc7807eb9c12b8bccb/raw/WMTSCapabilities.xml<br /> <br /> === XML-Schema-Validierung für &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt; ===<br /> <br /> Siehe auch [https://stackoverflow.com/a/129401/674064 diese StackOverflow-Antwort bzgl. &quot;XML Schema (XSD) validation tool&quot;].<br /> <br /> ==== Mit &lt;code&gt;xmllint&lt;/code&gt; (libxml) ====<br /> <br /> (CLI-Tool, das bei libxml mitinstalliert wird, und somit auf Linux &amp; Mac meist bereits vorhanden ist.)<br /> <br /> &lt;pre&gt;<br /> xmllint --noout --schema http://www.opengis.net/wmts/1.0 WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> oder<br /> &lt;pre&gt;<br /> xmllint --noout --schema http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> (Falls das Schema lokal vorhanden ist, kann auch der Pfad zur Schema-Datei angegeben werden. Umgekehrt kann die XML-Datei auch als URL angegeben werden, um eine online verfügbare Version zu validieren. Allerdings scheint für Schema und XML nur HTTP, nicht aber HTTPS zu funktionieren.)<br /> <br /> ==== Mit &lt;code&gt;xsd-validator&lt;/code&gt; ====<br /> <br /> (Kleines Java-Programm, das den Standard-XML-Parser der JRE (normalerweise Xerces) verwendet.)<br /> <br /> &lt;pre&gt;<br /> git clone https://github.com/amouat/xsd-validator.git<br /> wget http://www.opengis.net/wmts/1.0 --output-document=wmts.xsd<br /> wget http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd<br /> ./xsd-validator/xsdv.sh wmts.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> <br /> oder einfach<br /> <br /> &lt;pre&gt;<br /> git clone https://github.com/amouat/xsd-validator.git<br /> wget http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd<br /> ./xsd-validator/xsdv.sh wmtsGetCapabilities_response.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> <br /> (&lt;code&gt;xsd-validator&lt;/code&gt; kann nur mit lokalen Schema-Dateien umgehen, daher laden wir diese(s) hier mit &lt;code&gt;wget&lt;/code&gt; selbst herunter. Auch die XML-Datei muss lokal vorliegen.)<br /> <br /> <br /> === TileMatrixSet ===<br /> <br /> Für einen Kachel-Satz nach OSM- &amp; Google Maps-Konvention kann das &quot;Well-known scale set&quot; &quot;GoogleMapsCompatible&quot; (&lt;code&gt;&lt;nowiki&gt;urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible&lt;/nowiki&gt;&lt;/code&gt;) aus Annex E.4 des [http://portal.opengeospatial.org/files/?artifact_id=35326 Standards] verwendet werden.<br /> <br /> ==== Scale Denominator ====<br /> <br /> In Tabelle E.4 &quot;Definition of Well-known scale set GoogleMapsCompatible&quot; im Standard sind die Werte des &quot;Scale Denominator&quot; bereits für die Zoom-Levels 0&amp;ndash;18 angegeben. Diese lassen sich aber auch wie folgt berechnen:<br /> <br /> ===== Herleitung =====<br /> <br /> In Abschnitt 6.1 &quot;Tile matrix set – the geometry of the tiled space&quot; des Standards erhalten wir (unten auf Seite 8) u.A. folgende beiden Formeln:<br /> &lt;pre&gt;pixelSpan = scaleDenominator × 0.28e-3 / metersPerUnit(crs)&lt;/pre&gt;<br /> &lt;pre&gt;tileSpanX = tileWidth × pixelSpan&lt;/pre&gt;<br /> <br /> Daraus folgt<br /> &lt;pre&gt;tileSpanX = tileWidth × scaleDenominator × 0.28e-3 / metersPerUnit(crs)&lt;/pre&gt;<br /> und daraus durch auflösen nach &lt;code&gt;scaleDenominator&lt;/code&gt;<br /> &lt;pre&gt;scaleDenominator = tileSpanX × metersPerUnit(crs) / (tileWidth × 0.28e-3)&lt;/pre&gt;<br /> <br /> Die Kachel-Kantenlänge in Pixel &lt;code&gt;tileWidth&lt;/code&gt; ist bei OSM &amp; Google immer '''256'''.<br /> <br /> Das CRS WebMercator verwendet (pseudo-)Metrische Koordinaten, daher ist &lt;code&gt;metersPerUnit(crs)&lt;/code&gt; hierfür '''1'''.<br /> <br /> Bei Zoomlevel &lt;code&gt;Z&lt;/code&gt; wird die Welt zwischen 85.06°S and 85.06°N (und von 180°W bis 180°O) auf &lt;code&gt;2^Z × 2^Z&lt;/code&gt; Kacheln abgebildet. Entlang des Äquators hat man also &lt;code&gt;2^Z&lt;/code&gt; Kachel-Kanten. Laut Annex E.4 stimmen die &quot;Scale Denominator&quot;-Werte nur in Äquatornähe, also können wir das verwenden. Der Äquator-Radius ([http://www.epsg-registry.org/report.htm?type=selection&amp;entity=urn:ogc:def:crs:EPSG::3857&amp;reportDetail=short&amp;style=urn:uuid:report-style:default-with-code&amp;style_name=OGP%20Default%20With%20Code&amp;title=EPSG:3857 im EPSG-Eintrag] &quot;Semi-Major Axis (a)&quot; genannt) ist der von WGS 84 und beträgt '''6'378'137&amp;nbsp;m'''. Mit &lt;code&gt;Tau&lt;/code&gt; (a.k.a. &lt;code&gt;2&amp;nbsp;Pi&lt;/code&gt;) multipliziert ergibt dies die Äquatorlänge. Damit ist<br /> &lt;pre&gt;<br /> tileSpanX = Äquatorlänge / (2^Z)<br /> = 6378137 × Tau / (2^Z)<br /> &lt;/pre&gt;<br /> <br /> Damit ergibt sich<br /> &lt;pre&gt;scaleDenominator = (6378137 × Tau / (2^Z)) / (256 × 0.28e-3)&lt;/pre&gt;<br /> oder umgeformt die<br /> <br /> ===== Berechnungsformel =====<br /> &lt;pre&gt;scaleDenominator = 6378137 × Tau / (256 × (2^Z) × 0.28e-3)&lt;/pre&gt;<br /> <br /> Berechnung für Zoomlevels 0&amp;ndash;18 in Python 3.6:<br /> &lt;pre&gt;<br /> from math import tau<br /> <br /> equator_length = 6378137 * tau<br /> {i : equator_length / (256 * 2**i * 0.28e-3) for i in range(19)}<br /> &lt;/pre&gt;<br /> &lt;pre&gt;<br /> {0: 559082264.0287178,<br /> 1: 279541132.0143589,<br /> 2: 139770566.00717944,<br /> 3: 69885283.00358972,<br /> 4: 34942641.50179486,<br /> 5: 17471320.75089743,<br /> 6: 8735660.375448715,<br /> 7: 4367830.1877243575,<br /> 8: 2183915.0938621787,<br /> 9: 1091957.5469310894,<br /> 10: 545978.7734655447,<br /> 11: 272989.38673277234,<br /> 12: 136494.69336638617,<br /> 13: 68247.34668319309,<br /> 14: 34123.67334159654,<br /> 15: 17061.83667079827,<br /> 16: 8530.918335399136,<br /> 17: 4265.459167699568,<br /> 18: 2132.729583849784}<br /> &lt;/pre&gt;<br /> <br /> ==== Pixel Size (m) ====<br /> <br /> Die im Annex E.4 angegebenen (obwohl im XML wohl nicht anzugebenden) Pixel-Grössen in Metern ergeben sich, wenn man aus obiger Formel den mysteriösen 0.28&amp;nbsp;mm/px-Faktor weglässt:<br /> &lt;pre&gt;pixelSize = 6378137 × Tau / (256 × (2^Z))&lt;/pre&gt;<br /> <br /> Berechnung für Zoomlevels 0&amp;ndash;18 in Python 3.6:<br /> &lt;pre&gt;<br /> from math import tau<br /> <br /> equator_length = 6378137 * tau<br /> {i : equator_length / (256 * 2**i) for i in range(19)}<br /> &lt;/pre&gt;<br /> &lt;pre&gt;<br /> {0: 156543.03392804097,<br /> 1: 78271.51696402048,<br /> 2: 39135.75848201024,<br /> 3: 19567.87924100512,<br /> 4: 9783.93962050256,<br /> 5: 4891.96981025128,<br /> 6: 2445.98490512564,<br /> 7: 1222.99245256282,<br /> 8: 611.49622628141,<br /> 9: 305.748113140705,<br /> 10: 152.8740565703525,<br /> 11: 76.43702828517625,<br /> 12: 38.21851414258813,<br /> 13: 19.109257071294063,<br /> 14: 9.554628535647032,<br /> 15: 4.777314267823516,<br /> 16: 2.388657133911758,<br /> 17: 1.194328566955879,<br /> 18: 0.5971642834779395}<br /> &lt;/pre&gt;</div> Das-g https://giswiki.hsr.ch/index.php?title=GeoTIFF&diff=63945 GeoTIFF 2018-02-20T13:57:08Z <p>Das-g: /* General information */ make cogoe.org a link</p> <hr /> <div>See also:<br /> * [[GDAL]] - Translator<br /> <br /> == Tipps ==<br /> <br /> === How to convert Tiff to GeoTIFF ===<br /> <br /> See [[GDAL]].<br /> <br /> === How to remove the nodata values from a GeoTIFF? ===<br /> <br /> I find many instructions on how to add the values, but none on how to remove them. =&gt; There isn't a direct way of accomplishing this. You could extract a work.vrt file, then manually edit it and remove the line(s) with the NoDataValue tags. Then convert back to geotiff:<br /> <br /> % gdal_translate -of VRT your.tif work.vrt<br /> % gdal_translate work.vrt fixed_your.tif<br /> <br /> === &quot;cloud optimized&quot; GeoTIFF ===<br /> <br /> ==== General information ====<br /> * http://cogeo.org<br /> * https://trac.osgeo.org/gdal/wiki/CloudOptimizedGeoTIFF<br /> * [https://fosdem.org/2018/schedule/event/geo_gdal/ FOSDEM'18 talk &quot;GDAL Tips and Tricks - GDAL installation, Python usage, and Cloud GeoTIFFs&quot;] by Jeremy Mayeres, 00:09:10 to 00:13:18<br /> <br /> ==== creation: GeoTIFF to &quot;cloud optimized GeoTIFF ====<br /> <br /> (According to above talk, 00:11:14)<br /> <br /> Create internal overviews (if not already created)<br /> <br /> gdaladdo -r average in.tif 2 4 8 16<br /> <br /> Then<br /> <br /> gdal_translate in.tif out.tif \<br /> -co TILED=YES \<br /> -co COPY_SRC_OVERVIEWS=YES \<br /> -co COMPRESS=LZW<br /> <br /> Host result on server supporting HTTP 1.1 Range Requests (Byte Serving). (Amazon S3, Google Cloud Storage, Azure all support this.)<br /> <br /> http://www.cogeo.org/developers-guide.html uses &lt;code&gt;-co COMPRESS=DEFLATE&lt;/code&gt; instead of &lt;code&gt;-co COMPRESS=LZW&lt;/code&gt;. According to https://trac.osgeo.org/gdal/wiki/CloudOptimizedGeoTIFF#Unspecifiedpoints, either can be used.<br /> <br /> ==== usage ====<br /> <br /> gdalinfo /vsicurl/http://landsat-pds.s3.amazonaws.com/L8/001/003/LC80010032014272LGN00/LC80010032014272LGN00_B1.TIF<br /> <br /> will only &lt;code&gt;HTTP GET&lt;/code&gt; the beginning of the file (with the metadata), not the complete GeoTIFF. Some [http://www.cogeo.org/#implementations other software] supports this as well. Also fetching only up to the neede overview when viewing data &quot;zoomed out&quot;.</div> Das-g https://giswiki.hsr.ch/index.php?title=GeoTIFF&diff=63892 GeoTIFF 2018-02-06T11:21:05Z <p>Das-g: /* usage */ fix markup</p> <hr /> <div>See also:<br /> * [[GDAL]] - Translator<br /> <br /> == Tipps ==<br /> <br /> === How to convert Tiff to GeoTIFF ===<br /> <br /> See [[GDAL]].<br /> <br /> === How to remove the nodata values from a GeoTIFF? ===<br /> <br /> I find many instructions on how to add the values, but none on how to remove them. =&gt; There isn't a direct way of accomplishing this. You could extract a work.vrt file, then manually edit it and remove the line(s) with the NoDataValue tags. Then convert back to geotiff:<br /> <br /> % gdal_translate -of VRT your.tif work.vrt<br /> % gdal_translate work.vrt fixed_your.tif<br /> <br /> === &quot;cloud optimized&quot; GeoTIFF ===<br /> <br /> ==== General information ====<br /> * cogeo.org<br /> * https://trac.osgeo.org/gdal/wiki/CloudOptimizedGeoTIFF<br /> * [https://fosdem.org/2018/schedule/event/geo_gdal/ FOSDEM'18 talk &quot;GDAL Tips and Tricks - GDAL installation, Python usage, and Cloud GeoTIFFs&quot;] by Jeremy Mayeres, 00:09:10 to 00:13:18<br /> <br /> ==== creation: GeoTIFF to &quot;cloud optimized GeoTIFF ====<br /> <br /> (According to above talk, 00:11:14)<br /> <br /> Create internal overviews (if not already created)<br /> <br /> gdaladdo -r average in.tif 2 4 8 16<br /> <br /> Then<br /> <br /> gdal_translate in.tif out.tif \<br /> -co TILED=YES \<br /> -co COPY_SRC_OVERVIEWS=YES \<br /> -co COMPRESS=LZW<br /> <br /> Host result on server supporting HTTP 1.1 Range Requests (Byte Serving). (Amazon S3, Google Cloud Storage, Azure all support this.)<br /> <br /> http://www.cogeo.org/developers-guide.html uses &lt;code&gt;-co COMPRESS=DEFLATE&lt;/code&gt; instead of &lt;code&gt;-co COMPRESS=LZW&lt;/code&gt;. According to https://trac.osgeo.org/gdal/wiki/CloudOptimizedGeoTIFF#Unspecifiedpoints, either can be used.<br /> <br /> ==== usage ====<br /> <br /> gdalinfo /vsicurl/http://landsat-pds.s3.amazonaws.com/L8/001/003/LC80010032014272LGN00/LC80010032014272LGN00_B1.TIF<br /> <br /> will only &lt;code&gt;HTTP GET&lt;/code&gt; the beginning of the file (with the metadata), not the complete GeoTIFF. Some [http://www.cogeo.org/#implementations other software] supports this as well. Also fetching only up to the neede overview when viewing data &quot;zoomed out&quot;.</div> Das-g https://giswiki.hsr.ch/index.php?title=GeoTIFF&diff=63891 GeoTIFF 2018-02-06T11:20:21Z <p>Das-g: /* &quot;cloud optimized&quot; GeoTIFF */ +usage</p> <hr /> <div>See also:<br /> * [[GDAL]] - Translator<br /> <br /> == Tipps ==<br /> <br /> === How to convert Tiff to GeoTIFF ===<br /> <br /> See [[GDAL]].<br /> <br /> === How to remove the nodata values from a GeoTIFF? ===<br /> <br /> I find many instructions on how to add the values, but none on how to remove them. =&gt; There isn't a direct way of accomplishing this. You could extract a work.vrt file, then manually edit it and remove the line(s) with the NoDataValue tags. Then convert back to geotiff:<br /> <br /> % gdal_translate -of VRT your.tif work.vrt<br /> % gdal_translate work.vrt fixed_your.tif<br /> <br /> === &quot;cloud optimized&quot; GeoTIFF ===<br /> <br /> ==== General information ====<br /> * cogeo.org<br /> * https://trac.osgeo.org/gdal/wiki/CloudOptimizedGeoTIFF<br /> * [https://fosdem.org/2018/schedule/event/geo_gdal/ FOSDEM'18 talk &quot;GDAL Tips and Tricks - GDAL installation, Python usage, and Cloud GeoTIFFs&quot;] by Jeremy Mayeres, 00:09:10 to 00:13:18<br /> <br /> ==== creation: GeoTIFF to &quot;cloud optimized GeoTIFF ====<br /> <br /> (According to above talk, 00:11:14)<br /> <br /> Create internal overviews (if not already created)<br /> <br /> gdaladdo -r average in.tif 2 4 8 16<br /> <br /> Then<br /> <br /> gdal_translate in.tif out.tif \<br /> -co TILED=YES \<br /> -co COPY_SRC_OVERVIEWS=YES \<br /> -co COMPRESS=LZW<br /> <br /> Host result on server supporting HTTP 1.1 Range Requests (Byte Serving). (Amazon S3, Google Cloud Storage, Azure all support this.)<br /> <br /> http://www.cogeo.org/developers-guide.html uses &lt;code&gt;-co COMPRESS=DEFLATE&lt;/code&gt; instead of &lt;code&gt;-co COMPRESS=LZW&lt;/code&gt;. According to https://trac.osgeo.org/gdal/wiki/CloudOptimizedGeoTIFF#Unspecifiedpoints, either can be used.<br /> <br /> ==== usage ====<br /> <br /> gdalinfo /vsicurl/http://landsat-pds.s3.amazonaws.com/L8/001/003/LC80010032014272LGN00/LC80010032014272LGN00_B1.TIF<br /> <br /> will only &lt;tt&lt;HTTP GET&lt;/tt&gt; the beginning of the file (with the metadata), not the complete GeoTIFF. Some [http://www.cogeo.org/#implementations other software] supports this as well. Also fetching only up to the neede overview when viewing data &quot;zoomed out&quot;.</div> Das-g https://giswiki.hsr.ch/index.php?title=GeoTIFF&diff=63890 GeoTIFF 2018-02-06T11:03:59Z <p>Das-g: add new Tipp /* &quot;cloud optimized&quot; GeoTIFF */</p> <hr /> <div>See also:<br /> * [[GDAL]] - Translator<br /> <br /> == Tipps ==<br /> <br /> === How to convert Tiff to GeoTIFF ===<br /> <br /> See [[GDAL]].<br /> <br /> === How to remove the nodata values from a GeoTIFF? ===<br /> <br /> I find many instructions on how to add the values, but none on how to remove them. =&gt; There isn't a direct way of accomplishing this. You could extract a work.vrt file, then manually edit it and remove the line(s) with the NoDataValue tags. Then convert back to geotiff:<br /> <br /> % gdal_translate -of VRT your.tif work.vrt<br /> % gdal_translate work.vrt fixed_your.tif<br /> <br /> === &quot;cloud optimized&quot; GeoTIFF ===<br /> <br /> ==== General information ====<br /> * cogeo.org<br /> * https://trac.osgeo.org/gdal/wiki/CloudOptimizedGeoTIFF<br /> * [https://fosdem.org/2018/schedule/event/geo_gdal/ FOSDEM'18 talk &quot;GDAL Tips and Tricks - GDAL installation, Python usage, and Cloud GeoTIFFs&quot;] by Jeremy Mayeres, 00:09:10 to 00:13:18<br /> <br /> ==== creation: GeoTIFF to &quot;cloud optimized GeoTIFF ====<br /> <br /> (According to above talk, 00:11:14)<br /> <br /> Create internal overviews (if not already created)<br /> <br /> gdaladdo -r average in.tif 2 4 8 16<br /> <br /> Then<br /> <br /> gdal_translate in.tif out.tif \<br /> -co TILED=YES \<br /> -co COPY_SRC_OVERVIEWS=YES \<br /> -co COMPRESS=LZW<br /> <br /> Host result on server supporting HTTP 1.1 Range Requests (Byte Serving). (Amazon S3, Google Cloud Storage, Azure all support this.)<br /> <br /> http://www.cogeo.org/developers-guide.html uses &lt;code&gt;-co COMPRESS=DEFLATE&lt;/code&gt; instead of &lt;code&gt;-co COMPRESS=LZW&lt;/code&gt;. According to https://trac.osgeo.org/gdal/wiki/CloudOptimizedGeoTIFF#Unspecifiedpoints, either can be used.</div> Das-g https://giswiki.hsr.ch/index.php?title=GeoTIFF&diff=63889 GeoTIFF 2018-02-06T10:46:43Z <p>Das-g: make each HowTo/Tip a subsection</p> <hr /> <div>See also:<br /> * [[GDAL]] - Translator<br /> <br /> == Tipps ==<br /> <br /> === How to convert Tiff to GeoTIFF ===<br /> <br /> See [[GDAL]].<br /> <br /> === How to remove the nodata values from a GeoTIFF? ===<br /> <br /> I find many instructions on how to add the values, but none on how to remove them. =&gt; There isn't a direct way of accomplishing this. You could extract a work.vrt file, then manually edit it and remove the line(s) with the NoDataValue tags. Then convert back to geotiff:<br /> <br /> % gdal_translate -of VRT your.tif work.vrt<br /> % gdal_translate work.vrt fixed_your.tif</div> Das-g https://giswiki.hsr.ch/index.php?title=GIS-Kurse&diff=63818 GIS-Kurse 2018-01-08T10:40:40Z <p>Das-g: /* Weiterbildung - Kurse und Workshops */ Die beiden Teile/Tage (&quot;I&quot; &amp; &quot;II&quot;) der QGIS-Einführung sind nun ein einziger (2-tägiger) Kurs!</p> <hr /> <div>GIS-Kurse am [[GISpunkt]] [[HSR]].<br /> <br /> &gt;&gt; Aktuelle Kurs-Durchführungen =&gt; siehe [[Agenda]]... &lt;&lt;<br /> <br /> Siehe auch '''[[GIS-Kurs- und Studienhilfsmittel]]'''.<br /> <br /> == Weiterbildung - Kurse und Workshops ==<br /> <br /> Kurse:<br /> * '''[[Kurs PostGIS Einführung I]]''' (Tageskurs)<br /> * '''[[Kurs PostGIS Einführung II]]''' (Tageskurs)<br /> * '''[[Kurs QGIS Einführung I]] &amp; [[Kurs QGIS Einführung II|II]]''' (2 Tage)<br /> * '''[[Kurs QGIS Fortgeschrittene]]''' (2 Tage)<br /> * '''[[Kurs PostgreSQL für Fortgeschrittene]]''' (Tageskurs)<br /> * '''[[Kurs Python richtig lernen]]''' (4 bzw. 2 Tage)<br /> * '''[[Kurs Geoprocessing mit Python]]''' (2 Tage)<br /> * '''[[Kurs Webkarten publizieren | Kurs Karten einfach erstellen und publizieren mit Cloud-Technologien (insbes. TileMill)]]''' (Tageskurs)<br /> <br /> Kurse nach Bedarf:<br /> * [[Kurs PostgreSQL für Adminstratoren und Entwickler]] (3 bis 5 Tage Individualunterricht beim Kunden)<br /> * [[Kurs Geodatenmanagement mit Python|Kurs-Vorschlag &quot;Geodatenmanagement mit Python und Open Source Software&quot;]] (2 Tage). <br /> * [[Kurs OSM und GIS|Kurs-Vorschlag &quot;OSM und GIS: Nutzung von OpenStreetMap in GIS&quot;]] (Tageskurs)<br /> * [[Kurs Vom GIS-Modell zur Applikation|Kurs-Vorschlag &quot;Vom GIS-Modell zur Applikation und zur Abgabe von Geodaten&quot;]] (2 Tage).<br /> <br /> Zertifikatskurse (CAS) und Masterstudien (MAS):<br /> * '''[http://www.gis.hsr.ch/cas CAS GIS in der Planung]''' (Zertifikatskurs)<br /> * '''[[UNIGIS]]'''<br /> <br /> == GIS im Studium Landschaftsarchitektur, Raumplanung und Bauingenieurwesen ==<br /> * [[GIS-Kurs- und Studienhilfsmittel]] für Kurse in den Modulen GIS 1 und GIS 2, GIS in LP3 an der HSR und GIS im Master MSE.<br /> * [[:Kategorie:Workshop PIM5-GIS2 2015|GIS2 2015]] Projektarbeiten 2015 des Moduls GIS 2.<br /> * [[:Kategorie:Workshop PIM5-GIS2 2014|GIS2 2014]] Projektarbeiten 2014 des Moduls GIS 2.<br /> * [[:Kategorie:WorkshopGIS2 2013|GIS2 2013]] Projektarbeiten 2013 des Moduls GIS 2.<br /> <br /> == GIS HSR intern ==<br /> * [[CAS GIS-Seminartag]] &quot;CH-Standards, Datenmodelle und rechtliche Grundlagen&quot; im Rahmen des 'CAS GIS in der Planung'<br /> * [[UNIGIS-Lektion Metadaten]] (UNIGIS Fernstudium)<br /> <br /> == Materialien ==<br /> * [[GIS-Kurs- und Studienhilfsmittel]]<br /> * [http://tankstelle.hsr.ch/index.php?kid=851&amp;mid=k Software Download ArcGIS] (mit HSR-Login!)<br /> <br /> [[Kategorie:Weiterbildung]]<br /> [[Kategorie:Lehre]]</div> Das-g https://giswiki.hsr.ch/index.php?title=GIS-Kurse&diff=63817 GIS-Kurse 2018-01-08T10:31:57Z <p>Das-g: /* Weiterbildung - Kurse und Workshops */ neuer QGIS-Kurs für Fortgeschrittene verlinkt</p> <hr /> <div>GIS-Kurse am [[GISpunkt]] [[HSR]].<br /> <br /> &gt;&gt; Aktuelle Kurs-Durchführungen =&gt; siehe [[Agenda]]... &lt;&lt;<br /> <br /> Siehe auch '''[[GIS-Kurs- und Studienhilfsmittel]]'''.<br /> <br /> == Weiterbildung - Kurse und Workshops ==<br /> <br /> Kurse:<br /> * '''[[Kurs PostGIS Einführung I]]''' (Tageskurs)<br /> * '''[[Kurs PostGIS Einführung II]]''' (Tageskurs)<br /> * '''[[Kurs QGIS Einführung I]]''' (Tageskurs)<br /> * '''[[Kurs QGIS Einführung II]]''' (Tageskurs)<br /> * '''[[Kurs QGIS Fortgeschrittene]]''' (2 Tage)<br /> * '''[[Kurs PostgreSQL für Fortgeschrittene]]''' (Tageskurs)<br /> * '''[[Kurs Python richtig lernen]]''' (4 bzw. 2 Tage)<br /> * '''[[Kurs Geoprocessing mit Python]]''' (2 Tage)<br /> * '''[[Kurs Webkarten publizieren | Kurs Karten einfach erstellen und publizieren mit Cloud-Technologien (insbes. TileMill)]]''' (Tageskurs)<br /> <br /> Kurse nach Bedarf:<br /> * [[Kurs PostgreSQL für Adminstratoren und Entwickler]] (3 bis 5 Tage Individualunterricht beim Kunden)<br /> * [[Kurs Geodatenmanagement mit Python|Kurs-Vorschlag &quot;Geodatenmanagement mit Python und Open Source Software&quot;]] (2 Tage). <br /> * [[Kurs OSM und GIS|Kurs-Vorschlag &quot;OSM und GIS: Nutzung von OpenStreetMap in GIS&quot;]] (Tageskurs)<br /> * [[Kurs Vom GIS-Modell zur Applikation|Kurs-Vorschlag &quot;Vom GIS-Modell zur Applikation und zur Abgabe von Geodaten&quot;]] (2 Tage).<br /> <br /> Zertifikatskurse (CAS) und Masterstudien (MAS):<br /> * '''[http://www.gis.hsr.ch/cas CAS GIS in der Planung]''' (Zertifikatskurs)<br /> * '''[[UNIGIS]]'''<br /> <br /> == GIS im Studium Landschaftsarchitektur, Raumplanung und Bauingenieurwesen ==<br /> * [[GIS-Kurs- und Studienhilfsmittel]] für Kurse in den Modulen GIS 1 und GIS 2, GIS in LP3 an der HSR und GIS im Master MSE.<br /> * [[:Kategorie:Workshop PIM5-GIS2 2015|GIS2 2015]] Projektarbeiten 2015 des Moduls GIS 2.<br /> * [[:Kategorie:Workshop PIM5-GIS2 2014|GIS2 2014]] Projektarbeiten 2014 des Moduls GIS 2.<br /> * [[:Kategorie:WorkshopGIS2 2013|GIS2 2013]] Projektarbeiten 2013 des Moduls GIS 2.<br /> <br /> == GIS HSR intern ==<br /> * [[CAS GIS-Seminartag]] &quot;CH-Standards, Datenmodelle und rechtliche Grundlagen&quot; im Rahmen des 'CAS GIS in der Planung'<br /> * [[UNIGIS-Lektion Metadaten]] (UNIGIS Fernstudium)<br /> <br /> == Materialien ==<br /> * [[GIS-Kurs- und Studienhilfsmittel]]<br /> * [http://tankstelle.hsr.ch/index.php?kid=851&amp;mid=k Software Download ArcGIS] (mit HSR-Login!)<br /> <br /> [[Kategorie:Weiterbildung]]<br /> [[Kategorie:Lehre]]</div> Das-g https://giswiki.hsr.ch/index.php?title=Web_Map_Tile_Service&diff=60812 Web Map Tile Service 2017-11-17T12:53:53Z <p>Das-g: /* XYZ &amp;rarr; WMTS */ Link zu Beispiel-WMTSCapabilities.xml: osm.ch-Kacheln</p> <hr /> <div>Der [[OGC]]-Standard '''Web Map Tile Service (WMTS)''' ([http://www.opengeospatial.org/standards/wmts offizielle Website mit Versionen], [http://portal.opengeospatial.org/files/?artifact_id=35326 PDF v1.0.0]) ist eine von [[Web Map Tiling#Spezifikationen|mehreren Konventionen]] um Rasterkarten als (potenziell vor-berechnete &amp; vor-gerenderte) Kachelsammlung anzubieten.<br /> <br /> Siehe auch Wikipedia ([https://en.wikipedia.org/wiki/Web_Map_Tile_Service en]|[https://de.wikipedia.org/wiki/Web_Map_Tile_Service de]).<br /> <br /> == Verwendung ==<br /> <br /> === Einbinden auf SwissTopo-Webkarte ===<br /> <br /> # Gehe auf https://map.geo.admin.ch/<br /> # Unter &quot;Advanced Tools&quot; (de: &quot;Erweiterte Werkzeuge&quot;), klicke &quot;Import&quot; (de: &quot;Importieren&quot;)<br /> # Gib die URL zur &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt;-Datei an<br /> # Klicke &quot;Connect&quot; (de: &quot;Verbinden&quot;)&lt;br /&gt;Die Liste der verfügbaren Layer des WMTS wird angezeigt. Durch Hovern über dem jeweiligen Listeneintrag wird eine Vorschau im Hintergrund geladen.<br /> # Für jeden gewünschten Layer:<br /> ## Wähle (durch Anklicken) den gewünschten WMTS-Layer aus der angezeigten Liste<br /> ## Füll wahlweise das Feld &quot;Description&quot; (de: &quot;Beschreibung&quot; aus) '''(optional)'''<br /> ## Klicke &quot;Add Layer&quot; (de: &quot;Layer Hinzufügen&quot;)<br /> <br /> <br /> === Einbinden in QGIS ===<br /> <br /> # Menü &quot;Layer&quot; &gt; &quot;Add Layer&quot; &gt; &quot;Add WMS/WMTS Layer...&quot; oder &lt;kbd&gt;Ctrl&lt;/kbd&gt;-&lt;kbd&gt;Shift&lt;/kbd&gt;-&lt;kbd&gt;W&lt;/kbd&gt;<br /> # Button &quot;New&quot;<br /> # Feld &quot;Name&quot; beliebig ausfüllen<br /> # In Feld &quot;URL&quot; die URL zur &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt;-Datei angeben<br /> # Button &quot;OK&quot;<br /> # Button &quot;Connect&quot;&lt;br /&gt;Die Liste der verfügbaren Layer des WMTS wird angezeigt.<br /> # Für jeden gewünschten Layer:<br /> ## Wähle (durch Anklicken) den gewünschten WMTS-Layer aus der angezeigten Liste<br /> ## Klicke Button &quot;Add&quot;<br /> # Klicke Button &quot;Close&quot;<br /> <br /> == Begrenzungen ==<br /> <br /> {| class=&quot;wikitable&quot;<br /> |-<br /> ! Position im XML-Baum (XPath)<br /> ! begrenzt<br /> ! mittels<br /> ! Minimalbeispiel<br /> ! Maximalbeispiel<br /> |-<br /> | &lt;code&gt;//Layer/ows:BoundingBox&lt;/code&gt;<br /> |<br /> das '''dargestellte Datenset'''<br /> des Layers<br /> <br /> (informativ;<br /> Tiles können auch ausserhalb verfügbar sein, stellen dort aber keine Daten dar)<br /> | Koordinaten im CRS des Layers<br /> | &lt;pre&gt;<br /> &lt;ows:BoundingBox&gt;<br /> &lt;ows:LowerCorner&gt;420000 30000&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;900000 350000&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:BoundingBox&gt;<br /> &lt;/pre&gt;<br /> | &lt;pre&gt;<br /> &lt;ows:BoundingBox crs=&quot;urn:ogc:def:crs:EPSG:6.3:21781&quot; dimensions=&quot;2&quot;&gt;<br /> &lt;ows:LowerCorner&gt;420000.000000 30000.000000&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;900000.000000 350000.000000&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:BoundingBox&gt;<br /> &lt;/pre&gt;<br /> |-<br /> | &lt;code&gt;//Layer/WGS84BoundingBox&lt;/code&gt;<br /> |<br /> das '''dargestellte Datenset'''<br /> des Layers<br /> <br /> (informativ;<br /> Tiles können auch ausserhalb verfügbar sein, stellen dort aber keine Daten dar)<br /> | dezimalen WGS84-Koordinaten (lon-lat: Längengrad vor Breitengrad)<br /> | &lt;pre&gt;<br /> &lt;ows:WGS84BoundingBox&gt;<br /> &lt;ows:LowerCorner&gt;-180 -85.05112878&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;180 85.05112878&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:WGS84BoundingBox&gt;<br /> &lt;/pre&gt;<br /> | &lt;pre&gt;<br /> &lt;ows:WGS84BoundingBox crs=&quot;urn:ogc:def:crs:OGC:2:84&quot; dimensions=&quot;2&quot;&gt;<br /> &lt;ows:LowerCorner&gt;-180.0 -85.05112877980659237838&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;180.0 85.05112877980659237838&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:WGS84BoundingBox&gt;<br /> &lt;/pre&gt;<br /> |-<br /> | &lt;code&gt;//Layer/TileMatrixSetLink/TileMatrixSetLimits/TileMatrixLimits&lt;/code&gt;<br /> |<br /> die '''abrufbaren Tiles'''<br /> des Layers<br /> für diese TileMatrix innerhalb des verlinken TileMatrixSets<br /> <br /> (normativ;<br /> Anfrage ausserhalb sollte zu &lt;code&gt;TileOutOfRange&lt;/code&gt;-Exception bzw. HTTP-Status-Code &lt;code&gt;400&lt;/code&gt; &lt;code&gt;Bad Request&lt;/code&gt; führen)<br /> | Tile-Indices<br /> | &lt;!-- TODO: Minimalbeispiel --&gt;<br /> | &lt;!-- TODO: Maximalbeispiel --&gt;<br /> |-<br /> | &lt;code&gt;//TileMatrixSet/BoundingBox&lt;/code&gt;<br /> |<br /> den '''Definitionsbereich''' des TileMatrixSets<br /> und damit<br /> die '''potentiell abrufbaren Tiles'''<br /> aller aktuellen ''und künftigen'' Layers,<br /> die dieses Set verwenden<br /> | Koordinaten im CRS des TileMatrixSets<br /> | &lt;!-- TODO: Minimalbeispiel --&gt;<br /> | &lt;!-- TODO: Maximalbeispiel --&gt;<br /> |-<br /> |}<br /> <br /> == XYZ &amp;rarr; WMTS ==<br /> <br /> Hat man bereits einen nach XYZ-Konvention im Web verfügbaren Kachel-Satz, so lässt sich aus diesem ein (RESTful) WTMS machen, in dem man eine passende (statische) ServiceMetadata-XML-Datei &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt; serviert.<br /> <br /> === Beispiel ===<br /> <br /> Kacheln von osm.ch:<br /> https://gist.githubusercontent.com/das-g/882334b2844d5cdc7807eb9c12b8bccb/raw/WMTSCapabilities.xml<br /> <br /> === XML-Schema-Validierung für &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt; ===<br /> <br /> Siehe auch [https://stackoverflow.com/a/129401/674064 diese StackOverflow-Antwort bzgl. &quot;XML Schema (XSD) validation tool&quot;].<br /> <br /> ==== Mit &lt;code&gt;xmllint&lt;/code&gt; (libxml) ====<br /> <br /> (CLI-Tool das bei libxml mitinstalliert wird, und somit auf Linux &amp; Mac meist bereits vorhanden ist.)<br /> <br /> &lt;pre&gt;<br /> xmllint --noout --schema http://www.opengis.net/wmts/1.0 WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> oder<br /> &lt;pre&gt;<br /> xmllint --noout --schema http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> (Falls das Schema lokal vorhanden ist, kann auch der Pfad zur Schema-Datei angegeben werden. Umgekehrt kann die XML-Datei auch als URL angegeben werden, um eine online verfügbare Version zu validieren. Allerdings scheint für Schema und XML nur HTTP, nicht aber HTTPS zu funktionieren.)<br /> <br /> ==== Mit &lt;code&gt;xsd-validator&lt;/code&gt; ====<br /> <br /> (Kleines Java-Programm, das den Standard-XML-Parser der JRE (normalerweise Xerces) verwendet.)<br /> <br /> &lt;pre&gt;<br /> git clone https://github.com/amouat/xsd-validator.git<br /> wget http://www.opengis.net/wmts/1.0 --output-document=wmts.xsd<br /> wget http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd<br /> ./xsd-validator/xsdv.sh wmts.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> <br /> oder einfach<br /> <br /> &lt;pre&gt;<br /> git clone https://github.com/amouat/xsd-validator.git<br /> wget http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd<br /> ./xsd-validator/xsdv.sh wmtsGetCapabilities_response.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> <br /> (&lt;code&gt;xsd-validator&lt;/code&gt; kann nur mit lokalen Schema-Dateien umgehen, daher laden wir diese(s) hier mit &lt;code&gt;wget&lt;/code&gt; selbst herunter. Auch die XML-Datei muss lokal vorliegen.)<br /> <br /> <br /> === TileMatrixSet ===<br /> <br /> Für einen Kachel-Satz nach OSM- &amp; Google Maps-Konvention kann das &quot;Well-known scale set&quot; &quot;GoogleMapsCompatible&quot; (&lt;code&gt;&lt;nowiki&gt;urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible&lt;/nowiki&gt;&lt;/code&gt;) aus Annex E.4 des [http://portal.opengeospatial.org/files/?artifact_id=35326 Standards] verwendet werden.<br /> <br /> ==== Scale Denominator ====<br /> <br /> In Tabelle E.4 &quot;Definition of Well-known scale set GoogleMapsCompatible&quot; im Standard sind die Werte des &quot;Scale Denominator&quot; bereits für die Zoom-Levels 0&amp;ndash;18 angegeben. Diese lassen sich aber auch wie folgt berechnen:<br /> <br /> ===== Herleitung =====<br /> <br /> In Abschnitt 6.1 &quot;Tile matrix set – the geometry of the tiled space&quot; des Standards erhalten wir (unten auf Seite 8) u.A. folgende beiden Formeln:<br /> &lt;pre&gt;pixelSpan = scaleDenominator × 0.28e-3 / metersPerUnit(crs)&lt;/pre&gt;<br /> &lt;pre&gt;tileSpanX = tileWidth × pixelSpan&lt;/pre&gt;<br /> <br /> Daraus folgt<br /> &lt;pre&gt;tileSpanX = tileWidth × scaleDenominator × 0.28e-3 / metersPerUnit(crs)&lt;/pre&gt;<br /> und daraus durch auflösen nach &lt;code&gt;scaleDenominator&lt;/code&gt;<br /> &lt;pre&gt;scaleDenominator = tileSpanX × metersPerUnit(crs) / (tileWidth × 0.28e-3)&lt;/pre&gt;<br /> <br /> Die Kachel-Kantenlänge in Pixel &lt;code&gt;tileWidth&lt;/code&gt; ist bei OSM &amp; Google immer '''256'''.<br /> <br /> Das CRS WebMercator verwendet (pseudo-)Metrische Koordinaten, daher ist &lt;code&gt;metersPerUnit(crs)&lt;/code&gt; hierfür '''1'''.<br /> <br /> Bei Zoomlevel &lt;code&gt;Z&lt;/code&gt; wird die Welt zwischen 85.06°S and 85.06°N (und von 180°W bis 180°O) auf &lt;code&gt;2^Z × 2^Z&lt;/code&gt; Kacheln abgebildet. Entlang des Äquators hat man also &lt;code&gt;2^Z&lt;/code&gt; Kachel-Kanten. Laut Annex E.4 stimmen die &quot;Scale Denominator&quot;-Werte nur in Äquatornähe, also können wir das verwenden. Der Äquator-Radius ([http://www.epsg-registry.org/report.htm?type=selection&amp;entity=urn:ogc:def:crs:EPSG::3857&amp;reportDetail=short&amp;style=urn:uuid:report-style:default-with-code&amp;style_name=OGP%20Default%20With%20Code&amp;title=EPSG:3857 im EPSG-Eintrag] &quot;Semi-Major Axis (a)&quot; genannt) ist der von WGS 84 und beträgt '''6'378'137&amp;nbsp;m'''. Mit &lt;code&gt;Tau&lt;/code&gt; (a.k.a. &lt;code&gt;2&amp;nbsp;Pi&lt;/code&gt;) multipliziert ergibt dies die Äquatorlänge. Damit ist<br /> &lt;pre&gt;<br /> tileSpanX = Äquatorlänge / (2^Z)<br /> = 6378137 × Tau / (2^Z)<br /> &lt;/pre&gt;<br /> <br /> Damit ergibt sich<br /> &lt;pre&gt;scaleDenominator = (6378137 × Tau / (2^Z)) / (256 × 0.28e-3)&lt;/pre&gt;<br /> oder umgeformt die<br /> <br /> ===== Berechnungsformel =====<br /> &lt;pre&gt;scaleDenominator = 6378137 × Tau / (256 × (2^Z) × 0.28e-3)&lt;/pre&gt;<br /> <br /> Berechnung für Zoomlevels 0&amp;ndash;18 in Python 3.6:<br /> &lt;pre&gt;<br /> from math import tau<br /> <br /> equator_length = 6378137 * tau<br /> {i : equator_length / (256 * 2**i * 0.28e-3) for i in range(19)}<br /> &lt;/pre&gt;<br /> &lt;pre&gt;<br /> {0: 559082264.0287178,<br /> 1: 279541132.0143589,<br /> 2: 139770566.00717944,<br /> 3: 69885283.00358972,<br /> 4: 34942641.50179486,<br /> 5: 17471320.75089743,<br /> 6: 8735660.375448715,<br /> 7: 4367830.1877243575,<br /> 8: 2183915.0938621787,<br /> 9: 1091957.5469310894,<br /> 10: 545978.7734655447,<br /> 11: 272989.38673277234,<br /> 12: 136494.69336638617,<br /> 13: 68247.34668319309,<br /> 14: 34123.67334159654,<br /> 15: 17061.83667079827,<br /> 16: 8530.918335399136,<br /> 17: 4265.459167699568,<br /> 18: 2132.729583849784}<br /> &lt;/pre&gt;<br /> <br /> ==== Pixel Size (m) ====<br /> <br /> Die im Annex E.4 angegebenen (obwohl im XML wohl nicht anzugebenden) Pixel-Grössen in Metern ergeben sich, wenn man aus obiger Formel den mysteriösen 0.28&amp;nbsp;mm/px-Faktor weglässt:<br /> &lt;pre&gt;pixelSize = 6378137 × Tau / (256 × (2^Z))&lt;/pre&gt;<br /> <br /> Berechnung für Zoomlevels 0&amp;ndash;18 in Python 3.6:<br /> &lt;pre&gt;<br /> from math import tau<br /> <br /> equator_length = 6378137 * tau<br /> {i : equator_length / (256 * 2**i) for i in range(19)}<br /> &lt;/pre&gt;<br /> &lt;pre&gt;<br /> {0: 156543.03392804097,<br /> 1: 78271.51696402048,<br /> 2: 39135.75848201024,<br /> 3: 19567.87924100512,<br /> 4: 9783.93962050256,<br /> 5: 4891.96981025128,<br /> 6: 2445.98490512564,<br /> 7: 1222.99245256282,<br /> 8: 611.49622628141,<br /> 9: 305.748113140705,<br /> 10: 152.8740565703525,<br /> 11: 76.43702828517625,<br /> 12: 38.21851414258813,<br /> 13: 19.109257071294063,<br /> 14: 9.554628535647032,<br /> 15: 4.777314267823516,<br /> 16: 2.388657133911758,<br /> 17: 1.194328566955879,<br /> 18: 0.5971642834779395}<br /> &lt;/pre&gt;</div> Das-g https://giswiki.hsr.ch/index.php?title=Web_Map_Tile_Service&diff=60682 Web Map Tile Service 2017-09-15T14:55:08Z <p>Das-g: Neuer Abschnitt /* Verwendung */ mit Anleitung für SwissTopo-Webkarte und QGIS</p> <hr /> <div>Der [[OGC]]-Standard '''Web Map Tile Service (WMTS)''' ([http://www.opengeospatial.org/standards/wmts offizielle Website mit Versionen], [http://portal.opengeospatial.org/files/?artifact_id=35326 PDF v1.0.0]) ist eine von [[Web Map Tiling#Spezifikationen|mehreren Konventionen]] um Rasterkarten als (potenziell vor-berechnete &amp; vor-gerenderte) Kachelsammlung anzubieten.<br /> <br /> Siehe auch Wikipedia ([https://en.wikipedia.org/wiki/Web_Map_Tile_Service en]|[https://de.wikipedia.org/wiki/Web_Map_Tile_Service de]).<br /> <br /> == Verwendung ==<br /> <br /> === Einbinden auf SwissTopo-Webkarte ===<br /> <br /> # Gehe auf https://map.geo.admin.ch/<br /> # Unter &quot;Advanced Tools&quot; (de: &quot;Erweiterte Werkzeuge&quot;), klicke &quot;Import&quot; (de: &quot;Importieren&quot;)<br /> # Gib die URL zur &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt;-Datei an<br /> # Klicke &quot;Connect&quot; (de: &quot;Verbinden&quot;)&lt;br /&gt;Die Liste der verfügbaren Layer des WMTS wird angezeigt. Durch Hovern über dem jeweiligen Listeneintrag wird eine Vorschau im Hintergrund geladen.<br /> # Für jeden gewünschten Layer:<br /> ## Wähle (durch Anklicken) den gewünschten WMTS-Layer aus der angezeigten Liste<br /> ## Füll wahlweise das Feld &quot;Description&quot; (de: &quot;Beschreibung&quot; aus) '''(optional)'''<br /> ## Klicke &quot;Add Layer&quot; (de: &quot;Layer Hinzufügen&quot;)<br /> <br /> <br /> === Einbinden in QGIS ===<br /> <br /> # Menü &quot;Layer&quot; &gt; &quot;Add Layer&quot; &gt; &quot;Add WMS/WMTS Layer...&quot; oder &lt;kbd&gt;Ctrl&lt;/kbd&gt;-&lt;kbd&gt;Shift&lt;/kbd&gt;-&lt;kbd&gt;W&lt;/kbd&gt;<br /> # Button &quot;New&quot;<br /> # Feld &quot;Name&quot; beliebig ausfüllen<br /> # In Feld &quot;URL&quot; die URL zur &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt;-Datei angeben<br /> # Button &quot;OK&quot;<br /> # Button &quot;Connect&quot;&lt;br /&gt;Die Liste der verfügbaren Layer des WMTS wird angezeigt.<br /> # Für jeden gewünschten Layer:<br /> ## Wähle (durch Anklicken) den gewünschten WMTS-Layer aus der angezeigten Liste<br /> ## Klicke Button &quot;Add&quot;<br /> # Klicke Button &quot;Close&quot;<br /> <br /> == Begrenzungen ==<br /> <br /> {| class=&quot;wikitable&quot;<br /> |-<br /> ! Position im XML-Baum (XPath)<br /> ! begrenzt<br /> ! mittels<br /> ! Minimalbeispiel<br /> ! Maximalbeispiel<br /> |-<br /> | &lt;code&gt;//Layer/ows:BoundingBox&lt;/code&gt;<br /> |<br /> das '''dargestellte Datenset'''<br /> des Layers<br /> <br /> (informativ;<br /> Tiles können auch ausserhalb verfügbar sein, stellen dort aber keine Daten dar)<br /> | Koordinaten im CRS des Layers<br /> | &lt;pre&gt;<br /> &lt;ows:BoundingBox&gt;<br /> &lt;ows:LowerCorner&gt;420000 30000&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;900000 350000&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:BoundingBox&gt;<br /> &lt;/pre&gt;<br /> | &lt;pre&gt;<br /> &lt;ows:BoundingBox crs=&quot;urn:ogc:def:crs:EPSG:6.3:21781&quot; dimensions=&quot;2&quot;&gt;<br /> &lt;ows:LowerCorner&gt;420000.000000 30000.000000&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;900000.000000 350000.000000&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:BoundingBox&gt;<br /> &lt;/pre&gt;<br /> |-<br /> | &lt;code&gt;//Layer/WGS84BoundingBox&lt;/code&gt;<br /> |<br /> das '''dargestellte Datenset'''<br /> des Layers<br /> <br /> (informativ;<br /> Tiles können auch ausserhalb verfügbar sein, stellen dort aber keine Daten dar)<br /> | dezimalen WGS84-Koordinaten (lon-lat: Längengrad vor Breitengrad)<br /> | &lt;pre&gt;<br /> &lt;ows:WGS84BoundingBox&gt;<br /> &lt;ows:LowerCorner&gt;-180 -85.05112878&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;180 85.05112878&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:WGS84BoundingBox&gt;<br /> &lt;/pre&gt;<br /> | &lt;pre&gt;<br /> &lt;ows:WGS84BoundingBox crs=&quot;urn:ogc:def:crs:OGC:2:84&quot; dimensions=&quot;2&quot;&gt;<br /> &lt;ows:LowerCorner&gt;-180.0 -85.05112877980659237838&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;180.0 85.05112877980659237838&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:WGS84BoundingBox&gt;<br /> &lt;/pre&gt;<br /> |-<br /> | &lt;code&gt;//Layer/TileMatrixSetLink/TileMatrixSetLimits/TileMatrixLimits&lt;/code&gt;<br /> |<br /> die '''abrufbaren Tiles'''<br /> des Layers<br /> für diese TileMatrix innerhalb des verlinken TileMatrixSets<br /> <br /> (normativ;<br /> Anfrage ausserhalb sollte zu &lt;code&gt;TileOutOfRange&lt;/code&gt;-Exception bzw. HTTP-Status-Code &lt;code&gt;400&lt;/code&gt; &lt;code&gt;Bad Request&lt;/code&gt; führen)<br /> | Tile-Indices<br /> | &lt;!-- TODO: Minimalbeispiel --&gt;<br /> | &lt;!-- TODO: Maximalbeispiel --&gt;<br /> |-<br /> | &lt;code&gt;//TileMatrixSet/BoundingBox&lt;/code&gt;<br /> |<br /> den '''Definitionsbereich''' des TileMatrixSets<br /> und damit<br /> die '''potentiell abrufbaren Tiles'''<br /> aller aktuellen ''und künftigen'' Layers,<br /> die dieses Set verwenden<br /> | Koordinaten im CRS des TileMatrixSets<br /> | &lt;!-- TODO: Minimalbeispiel --&gt;<br /> | &lt;!-- TODO: Maximalbeispiel --&gt;<br /> |-<br /> |}<br /> <br /> == XYZ &amp;rarr; WMTS ==<br /> <br /> Hat man bereits einen nach XYZ-Konvention im Web verfügbaren Kachel-Satz, so lässt sich aus diesem ein (RESTful) WTMS machen, in dem man eine passende (statische) ServiceMetadata-XML-Datei &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt; serviert.<br /> <br /> === XML-Schema-Validierung für &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt; ===<br /> <br /> Siehe auch [https://stackoverflow.com/a/129401/674064 diese StackOverflow-Antwort bzgl. &quot;XML Schema (XSD) validation tool&quot;].<br /> <br /> ==== Mit &lt;code&gt;xmllint&lt;/code&gt; (libxml) ====<br /> <br /> (CLI-Tool das bei libxml mitinstalliert wird, und somit auf Linux &amp; Mac meist bereits vorhanden ist.)<br /> <br /> &lt;pre&gt;<br /> xmllint --noout --schema http://www.opengis.net/wmts/1.0 WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> oder<br /> &lt;pre&gt;<br /> xmllint --noout --schema http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> (Falls das Schema lokal vorhanden ist, kann auch der Pfad zur Schema-Datei angegeben werden. Umgekehrt kann die XML-Datei auch als URL angegeben werden, um eine online verfügbare Version zu validieren. Allerdings scheint für Schema und XML nur HTTP, nicht aber HTTPS zu funktionieren.)<br /> <br /> ==== Mit &lt;code&gt;xsd-validator&lt;/code&gt; ====<br /> <br /> (Kleines Java-Programm, das den Standard-XML-Parser der JRE (normalerweise Xerces) verwendet.)<br /> <br /> &lt;pre&gt;<br /> git clone https://github.com/amouat/xsd-validator.git<br /> wget http://www.opengis.net/wmts/1.0 --output-document=wmts.xsd<br /> wget http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd<br /> ./xsd-validator/xsdv.sh wmts.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> <br /> oder einfach<br /> <br /> &lt;pre&gt;<br /> git clone https://github.com/amouat/xsd-validator.git<br /> wget http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd<br /> ./xsd-validator/xsdv.sh wmtsGetCapabilities_response.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> <br /> (&lt;code&gt;xsd-validator&lt;/code&gt; kann nur mit lokalen Schema-Dateien umgehen, daher laden wir diese(s) hier mit &lt;code&gt;wget&lt;/code&gt; selbst herunter. Auch die XML-Datei muss lokal vorliegen.)<br /> <br /> <br /> === TileMatrixSet ===<br /> <br /> Für einen Kachel-Satz nach OSM- &amp; Google Maps-Konvention kann das &quot;Well-known scale set&quot; &quot;GoogleMapsCompatible&quot; (&lt;code&gt;&lt;nowiki&gt;urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible&lt;/nowiki&gt;&lt;/code&gt;) aus Annex E.4 des [http://portal.opengeospatial.org/files/?artifact_id=35326 Standards] verwendet werden.<br /> <br /> ==== Scale Denominator ====<br /> <br /> In Tabelle E.4 &quot;Definition of Well-known scale set GoogleMapsCompatible&quot; im Standard sind die Werte des &quot;Scale Denominator&quot; bereits für die Zoom-Levels 0&amp;ndash;18 angegeben. Diese lassen sich aber auch wie folgt berechnen:<br /> <br /> ===== Herleitung =====<br /> <br /> In Abschnitt 6.1 &quot;Tile matrix set – the geometry of the tiled space&quot; des Standards erhalten wir (unten auf Seite 8) u.A. folgende beiden Formeln:<br /> &lt;pre&gt;pixelSpan = scaleDenominator × 0.28e-3 / metersPerUnit(crs)&lt;/pre&gt;<br /> &lt;pre&gt;tileSpanX = tileWidth × pixelSpan&lt;/pre&gt;<br /> <br /> Daraus folgt<br /> &lt;pre&gt;tileSpanX = tileWidth × scaleDenominator × 0.28e-3 / metersPerUnit(crs)&lt;/pre&gt;<br /> und daraus durch auflösen nach &lt;code&gt;scaleDenominator&lt;/code&gt;<br /> &lt;pre&gt;scaleDenominator = tileSpanX × metersPerUnit(crs) / (tileWidth × 0.28e-3)&lt;/pre&gt;<br /> <br /> Die Kachel-Kantenlänge in Pixel &lt;code&gt;tileWidth&lt;/code&gt; ist bei OSM &amp; Google immer '''256'''.<br /> <br /> Das CRS WebMercator verwendet (pseudo-)Metrische Koordinaten, daher ist &lt;code&gt;metersPerUnit(crs)&lt;/code&gt; hierfür '''1'''.<br /> <br /> Bei Zoomlevel &lt;code&gt;Z&lt;/code&gt; wird die Welt zwischen 85.06°S and 85.06°N (und von 180°W bis 180°O) auf &lt;code&gt;2^Z × 2^Z&lt;/code&gt; Kacheln abgebildet. Entlang des Äquators hat man also &lt;code&gt;2^Z&lt;/code&gt; Kachel-Kanten. Laut Annex E.4 stimmen die &quot;Scale Denominator&quot;-Werte nur in Äquatornähe, also können wir das verwenden. Der Äquator-Radius ([http://www.epsg-registry.org/report.htm?type=selection&amp;entity=urn:ogc:def:crs:EPSG::3857&amp;reportDetail=short&amp;style=urn:uuid:report-style:default-with-code&amp;style_name=OGP%20Default%20With%20Code&amp;title=EPSG:3857 im EPSG-Eintrag] &quot;Semi-Major Axis (a)&quot; genannt) ist der von WGS 84 und beträgt '''6'378'137&amp;nbsp;m'''. Mit &lt;code&gt;Tau&lt;/code&gt; (a.k.a. &lt;code&gt;2&amp;nbsp;Pi&lt;/code&gt;) multipliziert ergibt dies die Äquatorlänge. Damit ist<br /> &lt;pre&gt;<br /> tileSpanX = Äquatorlänge / (2^Z)<br /> = 6378137 × Tau / (2^Z)<br /> &lt;/pre&gt;<br /> <br /> Damit ergibt sich<br /> &lt;pre&gt;scaleDenominator = (6378137 × Tau / (2^Z)) / (256 × 0.28e-3)&lt;/pre&gt;<br /> oder umgeformt die<br /> <br /> ===== Berechnungsformel =====<br /> &lt;pre&gt;scaleDenominator = 6378137 × Tau / (256 × (2^Z) × 0.28e-3)&lt;/pre&gt;<br /> <br /> Berechnung für Zoomlevels 0&amp;ndash;18 in Python 3.6:<br /> &lt;pre&gt;<br /> from math import tau<br /> <br /> equator_length = 6378137 * tau<br /> {i : equator_length / (256 * 2**i * 0.28e-3) for i in range(19)}<br /> &lt;/pre&gt;<br /> &lt;pre&gt;<br /> {0: 559082264.0287178,<br /> 1: 279541132.0143589,<br /> 2: 139770566.00717944,<br /> 3: 69885283.00358972,<br /> 4: 34942641.50179486,<br /> 5: 17471320.75089743,<br /> 6: 8735660.375448715,<br /> 7: 4367830.1877243575,<br /> 8: 2183915.0938621787,<br /> 9: 1091957.5469310894,<br /> 10: 545978.7734655447,<br /> 11: 272989.38673277234,<br /> 12: 136494.69336638617,<br /> 13: 68247.34668319309,<br /> 14: 34123.67334159654,<br /> 15: 17061.83667079827,<br /> 16: 8530.918335399136,<br /> 17: 4265.459167699568,<br /> 18: 2132.729583849784}<br /> &lt;/pre&gt;<br /> <br /> ==== Pixel Size (m) ====<br /> <br /> Die im Annex E.4 angegebenen (obwohl im XML wohl nicht anzugebenden) Pixel-Grössen in Metern ergeben sich, wenn man aus obiger Formel den mysteriösen 0.28&amp;nbsp;mm/px-Faktor weglässt:<br /> &lt;pre&gt;pixelSize = 6378137 × Tau / (256 × (2^Z))&lt;/pre&gt;<br /> <br /> Berechnung für Zoomlevels 0&amp;ndash;18 in Python 3.6:<br /> &lt;pre&gt;<br /> from math import tau<br /> <br /> equator_length = 6378137 * tau<br /> {i : equator_length / (256 * 2**i) for i in range(19)}<br /> &lt;/pre&gt;<br /> &lt;pre&gt;<br /> {0: 156543.03392804097,<br /> 1: 78271.51696402048,<br /> 2: 39135.75848201024,<br /> 3: 19567.87924100512,<br /> 4: 9783.93962050256,<br /> 5: 4891.96981025128,<br /> 6: 2445.98490512564,<br /> 7: 1222.99245256282,<br /> 8: 611.49622628141,<br /> 9: 305.748113140705,<br /> 10: 152.8740565703525,<br /> 11: 76.43702828517625,<br /> 12: 38.21851414258813,<br /> 13: 19.109257071294063,<br /> 14: 9.554628535647032,<br /> 15: 4.777314267823516,<br /> 16: 2.388657133911758,<br /> 17: 1.194328566955879,<br /> 18: 0.5971642834779395}<br /> &lt;/pre&gt;</div> Das-g https://giswiki.hsr.ch/index.php?title=Web_Map_Tile_Service&diff=60681 Web Map Tile Service 2017-09-15T09:26:21Z <p>Das-g: verlinke Standard</p> <hr /> <div>Der [[OGC]]-Standard '''Web Map Tile Service (WMTS)''' ([http://www.opengeospatial.org/standards/wmts offizielle Website mit Versionen], [http://portal.opengeospatial.org/files/?artifact_id=35326 PDF v1.0.0]) ist eine von [[Web Map Tiling#Spezifikationen|mehreren Konventionen]] um Rasterkarten als (potenziell vor-berechnete &amp; vor-gerenderte) Kachelsammlung anzubieten.<br /> <br /> Siehe auch Wikipedia ([https://en.wikipedia.org/wiki/Web_Map_Tile_Service en]|[https://de.wikipedia.org/wiki/Web_Map_Tile_Service de]).<br /> <br /> == Begrenzungen ==<br /> <br /> {| class=&quot;wikitable&quot;<br /> |-<br /> ! Position im XML-Baum (XPath)<br /> ! begrenzt<br /> ! mittels<br /> ! Minimalbeispiel<br /> ! Maximalbeispiel<br /> |-<br /> | &lt;code&gt;//Layer/ows:BoundingBox&lt;/code&gt;<br /> |<br /> das '''dargestellte Datenset'''<br /> des Layers<br /> <br /> (informativ;<br /> Tiles können auch ausserhalb verfügbar sein, stellen dort aber keine Daten dar)<br /> | Koordinaten im CRS des Layers<br /> | &lt;pre&gt;<br /> &lt;ows:BoundingBox&gt;<br /> &lt;ows:LowerCorner&gt;420000 30000&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;900000 350000&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:BoundingBox&gt;<br /> &lt;/pre&gt;<br /> | &lt;pre&gt;<br /> &lt;ows:BoundingBox crs=&quot;urn:ogc:def:crs:EPSG:6.3:21781&quot; dimensions=&quot;2&quot;&gt;<br /> &lt;ows:LowerCorner&gt;420000.000000 30000.000000&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;900000.000000 350000.000000&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:BoundingBox&gt;<br /> &lt;/pre&gt;<br /> |-<br /> | &lt;code&gt;//Layer/WGS84BoundingBox&lt;/code&gt;<br /> |<br /> das '''dargestellte Datenset'''<br /> des Layers<br /> <br /> (informativ;<br /> Tiles können auch ausserhalb verfügbar sein, stellen dort aber keine Daten dar)<br /> | dezimalen WGS84-Koordinaten (lon-lat: Längengrad vor Breitengrad)<br /> | &lt;pre&gt;<br /> &lt;ows:WGS84BoundingBox&gt;<br /> &lt;ows:LowerCorner&gt;-180 -85.05112878&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;180 85.05112878&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:WGS84BoundingBox&gt;<br /> &lt;/pre&gt;<br /> | &lt;pre&gt;<br /> &lt;ows:WGS84BoundingBox crs=&quot;urn:ogc:def:crs:OGC:2:84&quot; dimensions=&quot;2&quot;&gt;<br /> &lt;ows:LowerCorner&gt;-180.0 -85.05112877980659237838&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;180.0 85.05112877980659237838&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:WGS84BoundingBox&gt;<br /> &lt;/pre&gt;<br /> |-<br /> | &lt;code&gt;//Layer/TileMatrixSetLink/TileMatrixSetLimits/TileMatrixLimits&lt;/code&gt;<br /> |<br /> die '''abrufbaren Tiles'''<br /> des Layers<br /> für diese TileMatrix innerhalb des verlinken TileMatrixSets<br /> <br /> (normativ;<br /> Anfrage ausserhalb sollte zu &lt;code&gt;TileOutOfRange&lt;/code&gt;-Exception bzw. HTTP-Status-Code &lt;code&gt;400&lt;/code&gt; &lt;code&gt;Bad Request&lt;/code&gt; führen)<br /> | Tile-Indices<br /> | &lt;!-- TODO: Minimalbeispiel --&gt;<br /> | &lt;!-- TODO: Maximalbeispiel --&gt;<br /> |-<br /> | &lt;code&gt;//TileMatrixSet/BoundingBox&lt;/code&gt;<br /> |<br /> den '''Definitionsbereich''' des TileMatrixSets<br /> und damit<br /> die '''potentiell abrufbaren Tiles'''<br /> aller aktuellen ''und künftigen'' Layers,<br /> die dieses Set verwenden<br /> | Koordinaten im CRS des TileMatrixSets<br /> | &lt;!-- TODO: Minimalbeispiel --&gt;<br /> | &lt;!-- TODO: Maximalbeispiel --&gt;<br /> |-<br /> |}<br /> <br /> == XYZ &amp;rarr; WMTS ==<br /> <br /> Hat man bereits einen nach XYZ-Konvention im Web verfügbaren Kachel-Satz, so lässt sich aus diesem ein (RESTful) WTMS machen, in dem man eine passende (statische) ServiceMetadata-XML-Datei &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt; serviert.<br /> <br /> === XML-Schema-Validierung für &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt; ===<br /> <br /> Siehe auch [https://stackoverflow.com/a/129401/674064 diese StackOverflow-Antwort bzgl. &quot;XML Schema (XSD) validation tool&quot;].<br /> <br /> ==== Mit &lt;code&gt;xmllint&lt;/code&gt; (libxml) ====<br /> <br /> (CLI-Tool das bei libxml mitinstalliert wird, und somit auf Linux &amp; Mac meist bereits vorhanden ist.)<br /> <br /> &lt;pre&gt;<br /> xmllint --noout --schema http://www.opengis.net/wmts/1.0 WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> oder<br /> &lt;pre&gt;<br /> xmllint --noout --schema http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> (Falls das Schema lokal vorhanden ist, kann auch der Pfad zur Schema-Datei angegeben werden. Umgekehrt kann die XML-Datei auch als URL angegeben werden, um eine online verfügbare Version zu validieren. Allerdings scheint für Schema und XML nur HTTP, nicht aber HTTPS zu funktionieren.)<br /> <br /> ==== Mit &lt;code&gt;xsd-validator&lt;/code&gt; ====<br /> <br /> (Kleines Java-Programm, das den Standard-XML-Parser der JRE (normalerweise Xerces) verwendet.)<br /> <br /> &lt;pre&gt;<br /> git clone https://github.com/amouat/xsd-validator.git<br /> wget http://www.opengis.net/wmts/1.0 --output-document=wmts.xsd<br /> wget http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd<br /> ./xsd-validator/xsdv.sh wmts.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> <br /> oder einfach<br /> <br /> &lt;pre&gt;<br /> git clone https://github.com/amouat/xsd-validator.git<br /> wget http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd<br /> ./xsd-validator/xsdv.sh wmtsGetCapabilities_response.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> <br /> (&lt;code&gt;xsd-validator&lt;/code&gt; kann nur mit lokalen Schema-Dateien umgehen, daher laden wir diese(s) hier mit &lt;code&gt;wget&lt;/code&gt; selbst herunter. Auch die XML-Datei muss lokal vorliegen.)<br /> <br /> <br /> === TileMatrixSet ===<br /> <br /> Für einen Kachel-Satz nach OSM- &amp; Google Maps-Konvention kann das &quot;Well-known scale set&quot; &quot;GoogleMapsCompatible&quot; (&lt;code&gt;&lt;nowiki&gt;urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible&lt;/nowiki&gt;&lt;/code&gt;) aus Annex E.4 des [http://portal.opengeospatial.org/files/?artifact_id=35326 Standards] verwendet werden.<br /> <br /> ==== Scale Denominator ====<br /> <br /> In Tabelle E.4 &quot;Definition of Well-known scale set GoogleMapsCompatible&quot; im Standard sind die Werte des &quot;Scale Denominator&quot; bereits für die Zoom-Levels 0&amp;ndash;18 angegeben. Diese lassen sich aber auch wie folgt berechnen:<br /> <br /> ===== Herleitung =====<br /> <br /> In Abschnitt 6.1 &quot;Tile matrix set – the geometry of the tiled space&quot; des Standards erhalten wir (unten auf Seite 8) u.A. folgende beiden Formeln:<br /> &lt;pre&gt;pixelSpan = scaleDenominator × 0.28e-3 / metersPerUnit(crs)&lt;/pre&gt;<br /> &lt;pre&gt;tileSpanX = tileWidth × pixelSpan&lt;/pre&gt;<br /> <br /> Daraus folgt<br /> &lt;pre&gt;tileSpanX = tileWidth × scaleDenominator × 0.28e-3 / metersPerUnit(crs)&lt;/pre&gt;<br /> und daraus durch auflösen nach &lt;code&gt;scaleDenominator&lt;/code&gt;<br /> &lt;pre&gt;scaleDenominator = tileSpanX × metersPerUnit(crs) / (tileWidth × 0.28e-3)&lt;/pre&gt;<br /> <br /> Die Kachel-Kantenlänge in Pixel &lt;code&gt;tileWidth&lt;/code&gt; ist bei OSM &amp; Google immer '''256'''.<br /> <br /> Das CRS WebMercator verwendet (pseudo-)Metrische Koordinaten, daher ist &lt;code&gt;metersPerUnit(crs)&lt;/code&gt; hierfür '''1'''.<br /> <br /> Bei Zoomlevel &lt;code&gt;Z&lt;/code&gt; wird die Welt zwischen 85.06°S and 85.06°N (und von 180°W bis 180°O) auf &lt;code&gt;2^Z × 2^Z&lt;/code&gt; Kacheln abgebildet. Entlang des Äquators hat man also &lt;code&gt;2^Z&lt;/code&gt; Kachel-Kanten. Laut Annex E.4 stimmen die &quot;Scale Denominator&quot;-Werte nur in Äquatornähe, also können wir das verwenden. Der Äquator-Radius ([http://www.epsg-registry.org/report.htm?type=selection&amp;entity=urn:ogc:def:crs:EPSG::3857&amp;reportDetail=short&amp;style=urn:uuid:report-style:default-with-code&amp;style_name=OGP%20Default%20With%20Code&amp;title=EPSG:3857 im EPSG-Eintrag] &quot;Semi-Major Axis (a)&quot; genannt) ist der von WGS 84 und beträgt '''6'378'137&amp;nbsp;m'''. Mit &lt;code&gt;Tau&lt;/code&gt; (a.k.a. &lt;code&gt;2&amp;nbsp;Pi&lt;/code&gt;) multipliziert ergibt dies die Äquatorlänge. Damit ist<br /> &lt;pre&gt;<br /> tileSpanX = Äquatorlänge / (2^Z)<br /> = 6378137 × Tau / (2^Z)<br /> &lt;/pre&gt;<br /> <br /> Damit ergibt sich<br /> &lt;pre&gt;scaleDenominator = (6378137 × Tau / (2^Z)) / (256 × 0.28e-3)&lt;/pre&gt;<br /> oder umgeformt die<br /> <br /> ===== Berechnungsformel =====<br /> &lt;pre&gt;scaleDenominator = 6378137 × Tau / (256 × (2^Z) × 0.28e-3)&lt;/pre&gt;<br /> <br /> Berechnung für Zoomlevels 0&amp;ndash;18 in Python 3.6:<br /> &lt;pre&gt;<br /> from math import tau<br /> <br /> equator_length = 6378137 * tau<br /> {i : equator_length / (256 * 2**i * 0.28e-3) for i in range(19)}<br /> &lt;/pre&gt;<br /> &lt;pre&gt;<br /> {0: 559082264.0287178,<br /> 1: 279541132.0143589,<br /> 2: 139770566.00717944,<br /> 3: 69885283.00358972,<br /> 4: 34942641.50179486,<br /> 5: 17471320.75089743,<br /> 6: 8735660.375448715,<br /> 7: 4367830.1877243575,<br /> 8: 2183915.0938621787,<br /> 9: 1091957.5469310894,<br /> 10: 545978.7734655447,<br /> 11: 272989.38673277234,<br /> 12: 136494.69336638617,<br /> 13: 68247.34668319309,<br /> 14: 34123.67334159654,<br /> 15: 17061.83667079827,<br /> 16: 8530.918335399136,<br /> 17: 4265.459167699568,<br /> 18: 2132.729583849784}<br /> &lt;/pre&gt;<br /> <br /> ==== Pixel Size (m) ====<br /> <br /> Die im Annex E.4 angegebenen (obwohl im XML wohl nicht anzugebenden) Pixel-Grössen in Metern ergeben sich, wenn man aus obiger Formel den mysteriösen 0.28&amp;nbsp;mm/px-Faktor weglässt:<br /> &lt;pre&gt;pixelSize = 6378137 × Tau / (256 × (2^Z))&lt;/pre&gt;<br /> <br /> Berechnung für Zoomlevels 0&amp;ndash;18 in Python 3.6:<br /> &lt;pre&gt;<br /> from math import tau<br /> <br /> equator_length = 6378137 * tau<br /> {i : equator_length / (256 * 2**i) for i in range(19)}<br /> &lt;/pre&gt;<br /> &lt;pre&gt;<br /> {0: 156543.03392804097,<br /> 1: 78271.51696402048,<br /> 2: 39135.75848201024,<br /> 3: 19567.87924100512,<br /> 4: 9783.93962050256,<br /> 5: 4891.96981025128,<br /> 6: 2445.98490512564,<br /> 7: 1222.99245256282,<br /> 8: 611.49622628141,<br /> 9: 305.748113140705,<br /> 10: 152.8740565703525,<br /> 11: 76.43702828517625,<br /> 12: 38.21851414258813,<br /> 13: 19.109257071294063,<br /> 14: 9.554628535647032,<br /> 15: 4.777314267823516,<br /> 16: 2.388657133911758,<br /> 17: 1.194328566955879,<br /> 18: 0.5971642834779395}<br /> &lt;/pre&gt;</div> Das-g https://giswiki.hsr.ch/index.php?title=Web_Map_Tile_Service&diff=60680 Web Map Tile Service 2017-09-15T09:10:52Z <p>Das-g: /* Begrenzungen */ Beschreibung für //TileMatrixSet/BoundingBox präsisiert</p> <hr /> <div>Der [[OGC]]-Standard '''Web Map Tile Service (WMTS)''' ist eine von [[Web Map Tiling#Spezifikationen|mehreren Konventionen]] um Rasterkarten als (potenziell vor-berechnete &amp; vor-gerenderte) Kachelsammlung anzubieten.<br /> <br /> Siehe auch Wikipedia ([https://en.wikipedia.org/wiki/Web_Map_Tile_Service en]|[https://de.wikipedia.org/wiki/Web_Map_Tile_Service de]).<br /> <br /> == Begrenzungen ==<br /> <br /> {| class=&quot;wikitable&quot;<br /> |-<br /> ! Position im XML-Baum (XPath)<br /> ! begrenzt<br /> ! mittels<br /> ! Minimalbeispiel<br /> ! Maximalbeispiel<br /> |-<br /> | &lt;code&gt;//Layer/ows:BoundingBox&lt;/code&gt;<br /> |<br /> das '''dargestellte Datenset'''<br /> des Layers<br /> <br /> (informativ;<br /> Tiles können auch ausserhalb verfügbar sein, stellen dort aber keine Daten dar)<br /> | Koordinaten im CRS des Layers<br /> | &lt;pre&gt;<br /> &lt;ows:BoundingBox&gt;<br /> &lt;ows:LowerCorner&gt;420000 30000&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;900000 350000&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:BoundingBox&gt;<br /> &lt;/pre&gt;<br /> | &lt;pre&gt;<br /> &lt;ows:BoundingBox crs=&quot;urn:ogc:def:crs:EPSG:6.3:21781&quot; dimensions=&quot;2&quot;&gt;<br /> &lt;ows:LowerCorner&gt;420000.000000 30000.000000&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;900000.000000 350000.000000&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:BoundingBox&gt;<br /> &lt;/pre&gt;<br /> |-<br /> | &lt;code&gt;//Layer/WGS84BoundingBox&lt;/code&gt;<br /> |<br /> das '''dargestellte Datenset'''<br /> des Layers<br /> <br /> (informativ;<br /> Tiles können auch ausserhalb verfügbar sein, stellen dort aber keine Daten dar)<br /> | dezimalen WGS84-Koordinaten (lon-lat: Längengrad vor Breitengrad)<br /> | &lt;pre&gt;<br /> &lt;ows:WGS84BoundingBox&gt;<br /> &lt;ows:LowerCorner&gt;-180 -85.05112878&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;180 85.05112878&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:WGS84BoundingBox&gt;<br /> &lt;/pre&gt;<br /> | &lt;pre&gt;<br /> &lt;ows:WGS84BoundingBox crs=&quot;urn:ogc:def:crs:OGC:2:84&quot; dimensions=&quot;2&quot;&gt;<br /> &lt;ows:LowerCorner&gt;-180.0 -85.05112877980659237838&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;180.0 85.05112877980659237838&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:WGS84BoundingBox&gt;<br /> &lt;/pre&gt;<br /> |-<br /> | &lt;code&gt;//Layer/TileMatrixSetLink/TileMatrixSetLimits/TileMatrixLimits&lt;/code&gt;<br /> |<br /> die '''abrufbaren Tiles'''<br /> des Layers<br /> für diese TileMatrix innerhalb des verlinken TileMatrixSets<br /> <br /> (normativ;<br /> Anfrage ausserhalb sollte zu &lt;code&gt;TileOutOfRange&lt;/code&gt;-Exception bzw. HTTP-Status-Code &lt;code&gt;400&lt;/code&gt; &lt;code&gt;Bad Request&lt;/code&gt; führen)<br /> | Tile-Indices<br /> | &lt;!-- TODO: Minimalbeispiel --&gt;<br /> | &lt;!-- TODO: Maximalbeispiel --&gt;<br /> |-<br /> | &lt;code&gt;//TileMatrixSet/BoundingBox&lt;/code&gt;<br /> |<br /> den '''Definitionsbereich''' des TileMatrixSets<br /> und damit<br /> die '''potentiell abrufbaren Tiles'''<br /> aller aktuellen ''und künftigen'' Layers,<br /> die dieses Set verwenden<br /> | Koordinaten im CRS des TileMatrixSets<br /> | &lt;!-- TODO: Minimalbeispiel --&gt;<br /> | &lt;!-- TODO: Maximalbeispiel --&gt;<br /> |-<br /> |}<br /> <br /> == XYZ &amp;rarr; WMTS ==<br /> <br /> Hat man bereits einen nach XYZ-Konvention im Web verfügbaren Kachel-Satz, so lässt sich aus diesem ein (RESTful) WTMS machen, in dem man eine passende (statische) ServiceMetadata-XML-Datei &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt; serviert.<br /> <br /> === XML-Schema-Validierung für &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt; ===<br /> <br /> Siehe auch [https://stackoverflow.com/a/129401/674064 diese StackOverflow-Antwort bzgl. &quot;XML Schema (XSD) validation tool&quot;].<br /> <br /> ==== Mit &lt;code&gt;xmllint&lt;/code&gt; (libxml) ====<br /> <br /> (CLI-Tool das bei libxml mitinstalliert wird, und somit auf Linux &amp; Mac meist bereits vorhanden ist.)<br /> <br /> &lt;pre&gt;<br /> xmllint --noout --schema http://www.opengis.net/wmts/1.0 WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> oder<br /> &lt;pre&gt;<br /> xmllint --noout --schema http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> (Falls das Schema lokal vorhanden ist, kann auch der Pfad zur Schema-Datei angegeben werden. Umgekehrt kann die XML-Datei auch als URL angegeben werden, um eine online verfügbare Version zu validieren. Allerdings scheint für Schema und XML nur HTTP, nicht aber HTTPS zu funktionieren.)<br /> <br /> ==== Mit &lt;code&gt;xsd-validator&lt;/code&gt; ====<br /> <br /> (Kleines Java-Programm, das den Standard-XML-Parser der JRE (normalerweise Xerces) verwendet.)<br /> <br /> &lt;pre&gt;<br /> git clone https://github.com/amouat/xsd-validator.git<br /> wget http://www.opengis.net/wmts/1.0 --output-document=wmts.xsd<br /> wget http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd<br /> ./xsd-validator/xsdv.sh wmts.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> <br /> oder einfach<br /> <br /> &lt;pre&gt;<br /> git clone https://github.com/amouat/xsd-validator.git<br /> wget http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd<br /> ./xsd-validator/xsdv.sh wmtsGetCapabilities_response.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> <br /> (&lt;code&gt;xsd-validator&lt;/code&gt; kann nur mit lokalen Schema-Dateien umgehen, daher laden wir diese(s) hier mit &lt;code&gt;wget&lt;/code&gt; selbst herunter. Auch die XML-Datei muss lokal vorliegen.)<br /> <br /> <br /> === TileMatrixSet ===<br /> <br /> Für einen Kachel-Satz nach OSM- &amp; Google Maps-Konvention kann das &quot;Well-known scale set&quot; &quot;GoogleMapsCompatible&quot; (&lt;code&gt;&lt;nowiki&gt;urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible&lt;/nowiki&gt;&lt;/code&gt;) aus Annex E.4 des [http://portal.opengeospatial.org/files/?artifact_id=35326 Standards] verwendet werden.<br /> <br /> ==== Scale Denominator ====<br /> <br /> In Tabelle E.4 &quot;Definition of Well-known scale set GoogleMapsCompatible&quot; im Standard sind die Werte des &quot;Scale Denominator&quot; bereits für die Zoom-Levels 0&amp;ndash;18 angegeben. Diese lassen sich aber auch wie folgt berechnen:<br /> <br /> ===== Herleitung =====<br /> <br /> In Abschnitt 6.1 &quot;Tile matrix set – the geometry of the tiled space&quot; des Standards erhalten wir (unten auf Seite 8) u.A. folgende beiden Formeln:<br /> &lt;pre&gt;pixelSpan = scaleDenominator × 0.28e-3 / metersPerUnit(crs)&lt;/pre&gt;<br /> &lt;pre&gt;tileSpanX = tileWidth × pixelSpan&lt;/pre&gt;<br /> <br /> Daraus folgt<br /> &lt;pre&gt;tileSpanX = tileWidth × scaleDenominator × 0.28e-3 / metersPerUnit(crs)&lt;/pre&gt;<br /> und daraus durch auflösen nach &lt;code&gt;scaleDenominator&lt;/code&gt;<br /> &lt;pre&gt;scaleDenominator = tileSpanX × metersPerUnit(crs) / (tileWidth × 0.28e-3)&lt;/pre&gt;<br /> <br /> Die Kachel-Kantenlänge in Pixel &lt;code&gt;tileWidth&lt;/code&gt; ist bei OSM &amp; Google immer '''256'''.<br /> <br /> Das CRS WebMercator verwendet (pseudo-)Metrische Koordinaten, daher ist &lt;code&gt;metersPerUnit(crs)&lt;/code&gt; hierfür '''1'''.<br /> <br /> Bei Zoomlevel &lt;code&gt;Z&lt;/code&gt; wird die Welt zwischen 85.06°S and 85.06°N (und von 180°W bis 180°O) auf &lt;code&gt;2^Z × 2^Z&lt;/code&gt; Kacheln abgebildet. Entlang des Äquators hat man also &lt;code&gt;2^Z&lt;/code&gt; Kachel-Kanten. Laut Annex E.4 stimmen die &quot;Scale Denominator&quot;-Werte nur in Äquatornähe, also können wir das verwenden. Der Äquator-Radius ([http://www.epsg-registry.org/report.htm?type=selection&amp;entity=urn:ogc:def:crs:EPSG::3857&amp;reportDetail=short&amp;style=urn:uuid:report-style:default-with-code&amp;style_name=OGP%20Default%20With%20Code&amp;title=EPSG:3857 im EPSG-Eintrag] &quot;Semi-Major Axis (a)&quot; genannt) ist der von WGS 84 und beträgt '''6'378'137&amp;nbsp;m'''. Mit &lt;code&gt;Tau&lt;/code&gt; (a.k.a. &lt;code&gt;2&amp;nbsp;Pi&lt;/code&gt;) multipliziert ergibt dies die Äquatorlänge. Damit ist<br /> &lt;pre&gt;<br /> tileSpanX = Äquatorlänge / (2^Z)<br /> = 6378137 × Tau / (2^Z)<br /> &lt;/pre&gt;<br /> <br /> Damit ergibt sich<br /> &lt;pre&gt;scaleDenominator = (6378137 × Tau / (2^Z)) / (256 × 0.28e-3)&lt;/pre&gt;<br /> oder umgeformt die<br /> <br /> ===== Berechnungsformel =====<br /> &lt;pre&gt;scaleDenominator = 6378137 × Tau / (256 × (2^Z) × 0.28e-3)&lt;/pre&gt;<br /> <br /> Berechnung für Zoomlevels 0&amp;ndash;18 in Python 3.6:<br /> &lt;pre&gt;<br /> from math import tau<br /> <br /> equator_length = 6378137 * tau<br /> {i : equator_length / (256 * 2**i * 0.28e-3) for i in range(19)}<br /> &lt;/pre&gt;<br /> &lt;pre&gt;<br /> {0: 559082264.0287178,<br /> 1: 279541132.0143589,<br /> 2: 139770566.00717944,<br /> 3: 69885283.00358972,<br /> 4: 34942641.50179486,<br /> 5: 17471320.75089743,<br /> 6: 8735660.375448715,<br /> 7: 4367830.1877243575,<br /> 8: 2183915.0938621787,<br /> 9: 1091957.5469310894,<br /> 10: 545978.7734655447,<br /> 11: 272989.38673277234,<br /> 12: 136494.69336638617,<br /> 13: 68247.34668319309,<br /> 14: 34123.67334159654,<br /> 15: 17061.83667079827,<br /> 16: 8530.918335399136,<br /> 17: 4265.459167699568,<br /> 18: 2132.729583849784}<br /> &lt;/pre&gt;<br /> <br /> ==== Pixel Size (m) ====<br /> <br /> Die im Annex E.4 angegebenen (obwohl im XML wohl nicht anzugebenden) Pixel-Grössen in Metern ergeben sich, wenn man aus obiger Formel den mysteriösen 0.28&amp;nbsp;mm/px-Faktor weglässt:<br /> &lt;pre&gt;pixelSize = 6378137 × Tau / (256 × (2^Z))&lt;/pre&gt;<br /> <br /> Berechnung für Zoomlevels 0&amp;ndash;18 in Python 3.6:<br /> &lt;pre&gt;<br /> from math import tau<br /> <br /> equator_length = 6378137 * tau<br /> {i : equator_length / (256 * 2**i) for i in range(19)}<br /> &lt;/pre&gt;<br /> &lt;pre&gt;<br /> {0: 156543.03392804097,<br /> 1: 78271.51696402048,<br /> 2: 39135.75848201024,<br /> 3: 19567.87924100512,<br /> 4: 9783.93962050256,<br /> 5: 4891.96981025128,<br /> 6: 2445.98490512564,<br /> 7: 1222.99245256282,<br /> 8: 611.49622628141,<br /> 9: 305.748113140705,<br /> 10: 152.8740565703525,<br /> 11: 76.43702828517625,<br /> 12: 38.21851414258813,<br /> 13: 19.109257071294063,<br /> 14: 9.554628535647032,<br /> 15: 4.777314267823516,<br /> 16: 2.388657133911758,<br /> 17: 1.194328566955879,<br /> 18: 0.5971642834779395}<br /> &lt;/pre&gt;</div> Das-g https://giswiki.hsr.ch/index.php?title=Web_Map_Tile_Service&diff=60676 Web Map Tile Service 2017-09-14T16:08:27Z <p>Das-g: Neuer Abschnitt /* Begrenzungen */ mit Tabelle</p> <hr /> <div>Der [[OGC]]-Standard '''Web Map Tile Service (WMTS)''' ist eine von [[Web Map Tiling#Spezifikationen|mehreren Konventionen]] um Rasterkarten als (potenziell vor-berechnete &amp; vor-gerenderte) Kachelsammlung anzubieten.<br /> <br /> Siehe auch Wikipedia ([https://en.wikipedia.org/wiki/Web_Map_Tile_Service en]|[https://de.wikipedia.org/wiki/Web_Map_Tile_Service de]).<br /> <br /> == Begrenzungen ==<br /> <br /> {| class=&quot;wikitable&quot;<br /> |-<br /> ! Position im XML-Baum (XPath)<br /> ! begrenzt<br /> ! mittels<br /> ! Minimalbeispiel<br /> ! Maximalbeispiel<br /> |-<br /> | &lt;code&gt;//Layer/ows:BoundingBox&lt;/code&gt;<br /> |<br /> das '''dargestellte Datenset'''<br /> des Layers<br /> <br /> (informativ;<br /> Tiles können auch ausserhalb verfügbar sein, stellen dort aber keine Daten dar)<br /> | Koordinaten im CRS des Layers<br /> | &lt;pre&gt;<br /> &lt;ows:BoundingBox&gt;<br /> &lt;ows:LowerCorner&gt;420000 30000&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;900000 350000&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:BoundingBox&gt;<br /> &lt;/pre&gt;<br /> | &lt;pre&gt;<br /> &lt;ows:BoundingBox crs=&quot;urn:ogc:def:crs:EPSG:6.3:21781&quot; dimensions=&quot;2&quot;&gt;<br /> &lt;ows:LowerCorner&gt;420000.000000 30000.000000&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;900000.000000 350000.000000&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:BoundingBox&gt;<br /> &lt;/pre&gt;<br /> |-<br /> | &lt;code&gt;//Layer/WGS84BoundingBox&lt;/code&gt;<br /> |<br /> das '''dargestellte Datenset'''<br /> des Layers<br /> <br /> (informativ;<br /> Tiles können auch ausserhalb verfügbar sein, stellen dort aber keine Daten dar)<br /> | dezimalen WGS84-Koordinaten (lon-lat: Längengrad vor Breitengrad)<br /> | &lt;pre&gt;<br /> &lt;ows:WGS84BoundingBox&gt;<br /> &lt;ows:LowerCorner&gt;-180 -85.05112878&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;180 85.05112878&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:WGS84BoundingBox&gt;<br /> &lt;/pre&gt;<br /> | &lt;pre&gt;<br /> &lt;ows:WGS84BoundingBox crs=&quot;urn:ogc:def:crs:OGC:2:84&quot; dimensions=&quot;2&quot;&gt;<br /> &lt;ows:LowerCorner&gt;-180.0 -85.05112877980659237838&lt;/ows:LowerCorner&gt;<br /> &lt;ows:UpperCorner&gt;180.0 85.05112877980659237838&lt;/ows:UpperCorner&gt;<br /> &lt;/ows:WGS84BoundingBox&gt;<br /> &lt;/pre&gt;<br /> |-<br /> | &lt;code&gt;//Layer/TileMatrixSetLink/TileMatrixSetLimits/TileMatrixLimits&lt;/code&gt;<br /> |<br /> die '''abrufbaren Tiles'''<br /> des Layers<br /> für diese TileMatrix innerhalb des verlinken TileMatrixSets<br /> <br /> (normativ;<br /> Anfrage ausserhalb sollte zu &lt;code&gt;TileOutOfRange&lt;/code&gt;-Exception bzw. HTTP-Status-Code &lt;code&gt;400&lt;/code&gt; &lt;code&gt;Bad Request&lt;/code&gt; führen)<br /> | Tile-Indices<br /> | &lt;!-- TODO: Minimalbeispiel --&gt;<br /> | &lt;!-- TODO: Maximalbeispiel --&gt;<br /> |-<br /> | &lt;code&gt;//TileMatrixSet/BoundingBox&lt;/code&gt;<br /> |<br /> die '''potentiell abrufbaren Tiles'''<br /> des TileMatrixSets<br /> für alle aktuellen und künftigen Layers,<br /> die dieses Set verwenden<br /> | Koordinaten im CRS des TileMatrixSets<br /> | &lt;!-- TODO: Minimalbeispiel --&gt;<br /> | &lt;!-- TODO: Maximalbeispiel --&gt;<br /> |-<br /> |}<br /> <br /> == XYZ &amp;rarr; WMTS ==<br /> <br /> Hat man bereits einen nach XYZ-Konvention im Web verfügbaren Kachel-Satz, so lässt sich aus diesem ein (RESTful) WTMS machen, in dem man eine passende (statische) ServiceMetadata-XML-Datei &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt; serviert.<br /> <br /> === XML-Schema-Validierung für &lt;code&gt;WMTSCapabilities.xml&lt;/code&gt; ===<br /> <br /> Siehe auch [https://stackoverflow.com/a/129401/674064 diese StackOverflow-Antwort bzgl. &quot;XML Schema (XSD) validation tool&quot;].<br /> <br /> ==== Mit &lt;code&gt;xmllint&lt;/code&gt; (libxml) ====<br /> <br /> (CLI-Tool das bei libxml mitinstalliert wird, und somit auf Linux &amp; Mac meist bereits vorhanden ist.)<br /> <br /> &lt;pre&gt;<br /> xmllint --noout --schema http://www.opengis.net/wmts/1.0 WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> oder<br /> &lt;pre&gt;<br /> xmllint --noout --schema http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> (Falls das Schema lokal vorhanden ist, kann auch der Pfad zur Schema-Datei angegeben werden. Umgekehrt kann die XML-Datei auch als URL angegeben werden, um eine online verfügbare Version zu validieren. Allerdings scheint für Schema und XML nur HTTP, nicht aber HTTPS zu funktionieren.)<br /> <br /> ==== Mit &lt;code&gt;xsd-validator&lt;/code&gt; ====<br /> <br /> (Kleines Java-Programm, das den Standard-XML-Parser der JRE (normalerweise Xerces) verwendet.)<br /> <br /> &lt;pre&gt;<br /> git clone https://github.com/amouat/xsd-validator.git<br /> wget http://www.opengis.net/wmts/1.0 --output-document=wmts.xsd<br /> wget http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd<br /> ./xsd-validator/xsdv.sh wmts.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> <br /> oder einfach<br /> <br /> &lt;pre&gt;<br /> git clone https://github.com/amouat/xsd-validator.git<br /> wget http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd<br /> ./xsd-validator/xsdv.sh wmtsGetCapabilities_response.xsd WMTSCapabilities.xml<br /> &lt;/pre&gt;<br /> <br /> (&lt;code&gt;xsd-validator&lt;/code&gt; kann nur mit lokalen Schema-Dateien umgehen, daher laden wir diese(s) hier mit &lt;code&gt;wget&lt;/code&gt; selbst herunter. Auch die XML-Datei muss lokal vorliegen.)<br /> <br /> <br /> === TileMatrixSet ===<br /> <br /> Für einen Kachel-Satz nach OSM- &amp; Google Maps-Konvention kann das &quot;Well-known scale set&quot; &quot;GoogleMapsCompatible&quot; (&lt;code&gt;&lt;nowiki&gt;urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible&lt;/nowiki&gt;&lt;/code&gt;) aus Annex E.4 des [http://portal.opengeospatial.org/files/?artifact_id=35326 Standards] verwendet werden.<br /> <br /> ==== Scale Denominator ====<br /> <br /> In Tabelle E.4 &quot;Definition of Well-known scale set GoogleMapsCompatible&quot; im Standard sind die Werte des &quot;Scale Denominator&quot; bereits für die Zoom-Levels 0&amp;ndash;18 angegeben. Diese lassen sich aber auch wie folgt berechnen:<br /> <br /> ===== Herleitung =====<br /> <br /> In Abschnitt 6.1 &quot;Tile matrix set – the geometry of the tiled space&quot; des Standards erhalten wir (unten auf Seite 8) u.A. folgende beiden Formeln:<br /> &lt;pre&gt;pixelSpan = scaleDenominator × 0.28e-3 / metersPerUnit(crs)&lt;/pre&gt;<br /> &lt;pre&gt;tileSpanX = tileWidth × pixelSpan&lt;/pre&gt;<br /> <br /> Daraus folgt<br /> &lt;pre&gt;tileSpanX = tileWidth × scaleDenominator × 0.28e-3 / metersPerUnit(crs)&lt;/pre&gt;<br /> und daraus durch auflösen nach &lt;code&gt;scaleDenominator&lt;/code&gt;<br /> &lt;pre&gt;scaleDenominator = tileSpanX × metersPerUnit(crs) / (tileWidth × 0.28e-3)&lt;/pre&gt;<br /> <br /> Die Kachel-Kantenlänge in Pixel &lt;code&gt;tileWidth&lt;/code&gt; ist bei OSM &amp; Google immer '''256'''.<br /> <br /> Das CRS WebMercator verwendet (pseudo-)Metrische Koordinaten, daher ist &lt;code&gt;metersPerUnit(crs)&lt;/code&gt; hierfür '''1'''.<br /> <br /> Bei Zoomlevel &lt;code&gt;Z&lt;/code&gt; wird die Welt zwischen 85.06°S and 85.06°N (und von 180°W bis 180°O) auf &lt;code&gt;2^Z × 2^Z&lt;/code&gt; Kacheln abgebildet. Entlang des Äquators hat man also &lt;code&gt;2^Z&lt;/code&gt; Kachel-Kanten. Laut Annex E.4 stimmen die &quot;Scale Denominator&quot;-Werte nur in Äquatornähe, also können wir das verwenden. Der Äquator-Radius ([http://www.epsg-registry.org/report.htm?type=selection&amp;entity=urn:ogc:def:crs:EPSG::3857&amp;reportDetail=short&amp;style=urn:uuid:report-style:default-with-code&amp;style_name=OGP%20Default%20With%20Code&amp;title=EPSG:3857 im EPSG-Eintrag] &quot;Semi-Major Axis (a)&quot; genannt) ist der von WGS 84 und beträgt '''6'378'137&amp;nbsp;m'''. Mit &lt;code&gt;Tau&lt;/code&gt; (a.k.a. &lt;code&gt;2&amp;nbsp;Pi&lt;/code&gt;) multipliziert ergibt dies die Äquatorlänge. Damit ist<br /> &lt;pre&gt;<br /> tileSpanX = Äquatorlänge / (2^Z)<br /> = 6378137 × Tau / (2^Z)<br /> &lt;/pre&gt;<br /> <br /> Damit ergibt sich<br /> &lt;pre&gt;scaleDenominator = (6378137 × Tau / (2^Z)) / (256 × 0.28e-3)&lt;/pre&gt;<br /> oder umgeformt die<br /> <br /> ===== Berechnungsformel =====<br /> &lt;pre&gt;scaleDenominator = 6378137 × Tau / (256 × (2^Z) × 0.28e-3)&lt;/pre&gt;<br /> <br /> Berechnung für Zoomlevels 0&amp;ndash;18 in Python 3.6:<br /> &lt;pre&gt;<br /> from math import tau<br /> <br /> equator_length = 6378137 * tau<br /> {i : equator_length / (256 * 2**i * 0.28e-3) for i in range(19)}<br /> &lt;/pre&gt;<br /> &lt;pre&gt;<br /> {0: 559082264.0287178,<br /> 1: 279541132.0143589,<br /> 2: 139770566.00717944,<br /> 3: 69885283.00358972,<br /> 4: 34942641.50179486,<br /> 5: 17471320.75089743,<br /> 6: 8735660.375448715,<br /> 7: 4367830.1877243575,<br /> 8: 2183915.0938621787,<br /> 9: 1091957.5469310894,<br /> 10: 545978.7734655447,<br /> 11: 272989.38673277234,<br /> 12: 136494.69336638617,<br /> 13: 68247.34668319309,<br /> 14: 34123.67334159654,<br /> 15: 17061.83667079827,<br /> 16: 8530.918335399136,<br /> 17: 4265.459167699568,<br /> 18: 2132.729583849784}<br /> &lt;/pre&gt;<br /> <br /> ==== Pixel Size (m) ====<br /> <br /> Die im Annex E.4 angegebenen (obwohl im XML wohl nicht anzugebenden) Pixel-Grössen in Metern ergeben sich, wenn man aus obiger Formel den mysteriösen 0.28&amp;nbsp;mm/px-Faktor weglässt:<br /> &lt;pre&gt;pixelSize = 6378137 × Tau / (256 × (2^Z))&lt;/pre&gt;<br /> <br /> Berechnung für Zoomlevels 0&amp;ndash;18 in Python 3.6:<br /> &lt;pre&gt;<br /> from math import tau<br /> <br /> equator_length = 6378137 * tau<br /> {i : equator_length / (256 * 2**i) for i in range(19)}<br /> &lt;/pre&gt;<br /> &lt;pre&gt;<br /> {0: 156543.03392804097,<br /> 1: 78271.51696402048,<br /> 2: 39135.75848201024,<br /> 3: 19567.87924100512,<br /> 4: 9783.93962050256,<br /> 5: 4891.96981025128,<br /> 6: 2445.98490512564,<br /> 7: 1222.99245256282,<br /> 8: 611.49622628141,<br /> 9: 305.748113140705,<br /> 10: 152.8740565703525,<br /> 11: 76.43702828517625,<br /> 12: 38.21851414258813,<br /> 13: 19.109257071294063,<br /> 14: 9.554628535647032,<br /> 15: 4.777314267823516,<br /> 16: 2.388657133911758,<br /> 17: 1.194328566955879,<br /> 18: 0.5971642834779395}<br /> &lt;/pre&gt;</div> Das-g https://giswiki.hsr.ch/index.php?title=OSMaxx&diff=60664 OSMaxx 2017-09-06T11:37:11Z <p>Das-g: /* Documentation */ update link to schema documentation</p> <hr /> <div>[[Bild:Osmaxx_Logo.png|200px||right|link=http://osmaxx.hsr.ch]]<br /> '''&quot;OSM Arbitrary Excerpt Export&quot;''' (OSMaxx) [[Datei:Osmaxx_Logo_16x16.png]]<br /> <br /> &gt;&gt; Homepage http://osmaxx.hsr.ch/ &lt;&lt;<br /> <br /> ''(ENGLISH) Get the OpenStreetMap data you want in the file format you need! - Geospatial data from the unique and worldwide [[OpenStreetMap]] project, prepared für map visualization and analyses in GIS. <br /> Cuts out (extracts or excerpts) [[OpenStreetMap]] data, processes it to geodata and converts it to typical [[GIS]] fileformats before being prepared for download.''<br /> <br /> &quot;OpenStreetMap-Daten für GIS frei herunterladen, detailreich, weltweit!&quot; - Geodaten des einzigartigen und weltweiten OpenStreetMap-Projekts aufbereitet für Kartenvisualisierung und Analyse in GIS.<br /> Schneidet [[OpenStreetMap]]-Daten aus, bereitet sie zu Geodaten auf und stellt sie in verschiedenen gängigen [[GIS]]-Fileformaten zum Download zur Verfügung.<br /> <br /> '''Die Vorteile auf einen Blick:'''<br /> # Weltweite Vektordaten für GIS aufbereitet<br /> # Selber definierte Ausschnitte über Ländergrenzen hinweg<br /> # Hochaktuell (Stunden)<br /> # Sehr umfangreicher Inhalt and Objekten (z.B. Gebäudehöhen, Strassenbelag, Sitzbänke, etc.)<br /> <br /> Details:<br /> * Das Zielschema umfasst Geometrien (Punkt, Linestring, Polygon) sowie ein GIS-Datenmodell mit über 22 Tabellen/Layers (z.B. Highways, Railways, Buildings, etc.).<br /> * Verfügbare GIS-Fileformate zur Abgabe sind GeoPackage, Shapefle, File Geodatabase, OSM PBF sowie ein Navi-Format (Garmin .IMG).<br /> * Das Navi-Format (Garmin) enthält routingfähige Strassen. <br /> * Es werden auch Karten-Symbologien für QGIS und ArcGIS abgegeben, passend zu den GIS-Fileformaten.<br /> * Die Bearbeitung dauert je nach Grösse des Ausschnitts ca. 30 min.<br /> * Zur Aufbereitung gehört, dass die heterogenen OSM-Daten homogenisiert werden (z.B. Restaurants als Punktobjekte, auch wenn sie in OSM als Gebäudefläche erfasst wurden). Damit können bis zu einem Drittel mehr Informationen aus OMS herausgeholt werden im Vergleich zu den Rohdaten und zu einfachen Konvertern. <br /> <br /> === Useful Weblinks ===<br /> * For availability and performance status see e.g. https://twitter.com/geometalab <br /> * Repository (Source Code, Ticketing): https://github.com/geometalab/osmaxx<br /> * IFS internal (login required): https://wiki.ifs.hsr.ch/IfSwWiki/wiki.cgi?Osmaxx<br /> <br /> === Project ===<br /> <br /> Project staff (mainly from Geometa Lab HSR):<br /> * Stefan: Lead and concept<br /> * Raphael: Coordination, integration, frontend and backend<br /> * Tobias: Frontend (Javascript, ...)<br /> * Nicola: Backend (Python, PostgreSQL, ...)<br /> <br /> Former staff members:<br /> * Simran: several enhancements<br /> * Dhruv: PostGIS loading and schema transformation/data homogenization<br /> * Van An: QGIS symbology<br /> * Eugene: PostGIS loading and schema transformation/data homogenization<br /> * Lukas: Extraction tool chain (Linux tools, ...)<br /> * Martin: ArcGIS symbology (ArcGIS)<br /> <br /> === Map Gallery ===<br /> <br /> This gallery shows some maps made with OSMaxx data using QGIS styling (see also [[Making Maps from OpenStreetMap Data]]):<br /> &lt;gallery&gt;<br /> Datei:Rapperswil_square.png|Rapperswil (Switzerland)<br /> Datei:Frankfurt_square.png|Frankfurt (Germany)<br /> Datei:Asmara_square.png|Asmara (Eritrea)<br /> Datei:Tacloban_square.png|Tacloban City (Philippines)<br /> Datei:Port_au_prince_square.png|Port-au-prince (Haiti)<br /> Datei:Nairobi_square.png|Nairobi (Kenya)<br /> Datei:Gaza_square.png|Gaza (Palestine)<br /> &lt;/gallery&gt;<br /> <br /> === Documentation ===<br /> <br /> End user oriented documents and files of OSMaxx project (download tbd.):<br /> * &quot;Internal&quot;<br /> ** Data Model inc. Catalog of Objects/Entities (OSMaxx_Data_Model.odt) (=&gt; see also https://github.com/geometalab/osmaxx-docs)<br /> * Common fonts and symbols<br /> ** Font &quot;Deja Vu&quot; <br /> ** Point Symbols (.svg + .png)<br /> <br /> Symbology &quot;M1&quot; (meaning optimized for scale 1:2.500, i.e.1:1.000 to 1:10.000)<br /> * Symbol Catalog for &quot;M1&quot; (OSMaxx_SymbolCatalog.xlsx) (=&gt; see also https://github.com/geometalab/osmaxx-docs)<br /> * ArcGIS (.mdx/.lyr)<br /> * QGIS (.qgs)<br /> <br /> Symbology &quot;M2&quot; and &quot;M3&quot; (tbd.)<br /> * ...<br /> <br /> Data Model: <br /> * See Discussion <br /> * [https://github.com/geometalab/osmaxx/blob/master/docs/osmaxx_data_schema.md Export Schema Documentation] (on Github).<br /> <br /> <br /> [[Kategorie:Geodaten]]<br /> [[Kategorie:GIS]]<br /> [[Kategorie:OpenStreetMap]]</div> Das-g https://giswiki.hsr.ch/index.php?title=PostgreSQL_for_MySQL_Users&diff=60661 PostgreSQL for MySQL Users 2017-09-04T09:57:47Z <p>Das-g: nach https://wiki.hsr.ch/Datenbanken/wiki.cgi?PostgreSQLForMySQLUsers verschoben</p> <hr /> <div>Siehe [https://wiki.hsr.ch/Datenbanken/wiki.cgi?PostgreSQLForMySQLUsers HSR-Datenbanken-Wiki].</div> Das-g https://giswiki.hsr.ch/index.php?title=PostgreSQL_for_MySQL_Users&diff=60648 PostgreSQL for MySQL Users 2017-08-31T10:06:05Z <p>Das-g: new section /* MySQL's SHOW */</p> <hr /> <div>See also:<br /> * [[PostgreSQL]]<br /> <br /> Licensing: <br /> * MySQL: Dual Licensed<br /> * PostgreSQL: [https://wiki.postgresql.org/wiki/FAQ#What_is_the_license_of_PostgreSQL.3F BSD-Style]<br /> <br /> == Internet Resources ==<br /> <br /> * [https://wiki.postgresql.org/wiki/Things_to_find_out_about_when_moving_from_MySQL_to_PostgreSQL Things to find out about when moving from MySQL to PostgreSQL] (PostgreSQL wiki)<br /> * [https://opslife.org/postgresql-for-mysql-administrators/ PostgreSQL for MySQL Administrators] (opslife blog)<br /> * [http://www.coderholic.com/postgresql-for-mysql-users/ PostgreSQL for MySQL users] (coderholic blog)<br /> * [http://stackoverflow.com/questions/772111/switching-from-mysql-to-postgresql-tips-tricks-and-gotchas Switching from MySQL to PostgreSQL - tips, tricks and gotchas?] on StackOverflow<br /> <br /> == MySQL's &lt;code&gt;SHOW&lt;/code&gt; ==<br /> <br /> PostgreSQL uses the &lt;code&gt;SHOW&lt;/code&gt; keyword only for displaying run-time parameters. To inspect schemas, tables, views, columns in the command line interface (&lt;code&gt;psql&lt;/code&gt;) use [https://wiki.postgresql.org/wiki/FAQ#How_do_I_find_out_what_tables.2C_indexes.2C_databases.2C_and_users_are_defined.3F_How_do_I_see_the_queries_used_by_psql_to_display_them.3F the backslash commands] ([https://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-META-COMMANDS complete list]).<br /> <br /> <br /> == MySQL's &lt;code&gt;INSERT UPDATE&lt;/code&gt; ==<br /> Option 1) Write a function like:<br /> CREATE FUNCTION doinsert(_id integer, _value text) RETURNS void AS $$<br /> BEGIN<br /> UPDATE thetable SET value = _value WHERE id = _id;<br /> IF NOT FOUND THEN<br /> INSERT INTO thetable(id, value) VALUES (_id, _value);<br /> END IF<br /> END;<br /> $$ LANGUAGE plpgsql;<br /> <br /> Option 2) Use two SQL statements:<br /> -- update the existing<br /> UPDATE realTable SET VALUE = (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id)<br /> WHERE EXISTS (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id);<br /> -- insert the missing<br /> INSERT INTO realTable(id, value)<br /> SELECT id, value FROM tmp WHERE NOT EXISTS(SELECT 1 FROM realTable WHERE tmp.id = realTable.id);<br /> <br /> == MySQL's &lt;code&gt;AUTO INCREMENT&lt;/code&gt; ==<br /> * Oracle: &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> * MySQL: &lt;code&gt;id INT UNSIGNED NOT NULL AUTO_INCREMENT&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;id SERIAL&lt;/code&gt; oder &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> <br /> === Syntactic sugar: &lt;code&gt;SERIAL&lt;/code&gt; ===<br /> CREATE TABLE table_name (<br /> Identifier SERIAL,<br /> -- ...<br /> );<br /> <br /> See also<br /> * [https://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL Serial Types] in the PostgreSQL documentation<br /> * [https://wiki.postgresql.org/wiki/FAQ#How_do_I_create_a_serial.2Fauto-incrementing_field.3F How do I create a serial/auto-incrementing field?] in the PostgreSQL FAQ<br /> <br /> === The Explicit Way: &lt;code&gt;SEQUENCE&lt;/code&gt; ===<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Definition ====<br /> CREATE SEQUENCE myseq;<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Usage ====<br /> '''either''' as the column's default value:<br /> CREATE TABLE table_name (<br /> Identifier NUMBER DEFAULT nextval('myseq'),<br /> -- ...<br /> );<br /> '''or''' explicitly each time you insert a new row:<br /> INSERT ... INTO table_name VALUES(nextval('myseq'), 'Name', ...);<br /> <br /> == MySQL's &lt;code&gt;INT UNSIGNED&lt;/code&gt; (Cardinal) ==<br /> * MySQL: &lt;code&gt;column INT UNSIGNED&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;column INT CHECK (column &gt; 0)&lt;/code&gt;<br /> <br /> == MySQL's Index Type ==<br /> * MySQL: &lt;code&gt;INDEX idx_id(id)&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;CREATE INDEX idx_id ON TABLENAME(id);&lt;/code&gt;<br /> <br /> == MySQL's Query Resultset Limit ==<br /> * MySQL: &lt;code&gt;SELECT * FROM tbl LIMIT 10, 5&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;SELECT * FROM tbl LIMIT 5 OFFSET 10&lt;/code&gt;<br /> <br /> == Data types of MySQL versus PostgreSQL ==<br /> <br /> {| class=&quot;mw-datatable&quot;<br /> |-<br /> ! colspan=2 | Mysql !! colspan=2 | PostgreSQL!! <br /> |-<br /> ! Typ !! Beschreibung !! Typ !! Beschreibung <br /> |-<br /> | tinyint || -128..127 || - || - <br /> |-<br /> | smallint || -32768..+32767 || int2 || -32767 ... +32768 <br /> |-<br /> | int || -2147483648.. +2147483647 || int4 || -2147483648 ... +2147483647 <br /> |-<br /> | || || int8 || +/- 18 Dezimalstellen <br /> |-<br /> | float(n) || n E {4;8}, Einf./doppelte Genauig.|| float4 || 6 Dez.Stellen<br /> |-<br /> | || || float8 || 15 Dezimalstellen <br /> |-<br /> | date || YYYY-MM-DD Datumsformat || date || Datum, Datumformate mit SET DATESTYLE=Value einstellbar <br /> |-<br /> | time || HH-MM-SS Zeitformat || time || Uhrzeit, Auflösung 1 Mikrosekunde <br /> |-<br /> | char(m) || Zeichenkette mit fester Länge || char || ein Zeichen <br /> |-<br /> | varchar(m) || variable Länge, max. m Zeichen || varchar(n) || 4+n Bytes <br /> |-<br /> | blob || Binary Large Object, wird für Texte gebraucht, &quot;TINY&quot;, &quot;&quot;, &quot;LONG&quot; || bytea <br /> |-<br /> | || || money || 4 Byte, -21474836,48 ... +21474836,47 <br /> |-<br /> | || || text || Variable Länge<br /> |-<br /> | || || bool || Kann den Wert 't' oder 'f' annehmen <br /> |}</div> Das-g https://giswiki.hsr.ch/index.php?title=PostgreSQL_for_MySQL_Users&diff=60647 PostgreSQL for MySQL Users 2017-08-30T12:41:45Z <p>Das-g: link to official FAQ about license</p> <hr /> <div>See also:<br /> * [[PostgreSQL]]<br /> <br /> Licensing: <br /> * MySQL: Dual Licensed<br /> * PostgreSQL: [https://wiki.postgresql.org/wiki/FAQ#What_is_the_license_of_PostgreSQL.3F BSD-Style]<br /> <br /> == Internet Resources ==<br /> <br /> * [https://wiki.postgresql.org/wiki/Things_to_find_out_about_when_moving_from_MySQL_to_PostgreSQL Things to find out about when moving from MySQL to PostgreSQL] (PostgreSQL wiki)<br /> * [https://opslife.org/postgresql-for-mysql-administrators/ PostgreSQL for MySQL Administrators] (opslife blog)<br /> * [http://www.coderholic.com/postgresql-for-mysql-users/ PostgreSQL for MySQL users] (coderholic blog)<br /> * [http://stackoverflow.com/questions/772111/switching-from-mysql-to-postgresql-tips-tricks-and-gotchas Switching from MySQL to PostgreSQL - tips, tricks and gotchas?] on StackOverflow<br /> <br /> == MySQL's &lt;code&gt;INSERT UPDATE&lt;/code&gt; ==<br /> Option 1) Write a function like:<br /> CREATE FUNCTION doinsert(_id integer, _value text) RETURNS void AS $$<br /> BEGIN<br /> UPDATE thetable SET value = _value WHERE id = _id;<br /> IF NOT FOUND THEN<br /> INSERT INTO thetable(id, value) VALUES (_id, _value);<br /> END IF<br /> END;<br /> $$ LANGUAGE plpgsql;<br /> <br /> Option 2) Use two SQL statements:<br /> -- update the existing<br /> UPDATE realTable SET VALUE = (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id)<br /> WHERE EXISTS (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id);<br /> -- insert the missing<br /> INSERT INTO realTable(id, value)<br /> SELECT id, value FROM tmp WHERE NOT EXISTS(SELECT 1 FROM realTable WHERE tmp.id = realTable.id);<br /> <br /> == MySQL's &lt;code&gt;AUTO INCREMENT&lt;/code&gt; ==<br /> * Oracle: &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> * MySQL: &lt;code&gt;id INT UNSIGNED NOT NULL AUTO_INCREMENT&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;id SERIAL&lt;/code&gt; oder &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> <br /> === Syntactic sugar: &lt;code&gt;SERIAL&lt;/code&gt; ===<br /> CREATE TABLE table_name (<br /> Identifier SERIAL,<br /> -- ...<br /> );<br /> <br /> See also<br /> * [https://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL Serial Types] in the PostgreSQL documentation<br /> * [https://wiki.postgresql.org/wiki/FAQ#How_do_I_create_a_serial.2Fauto-incrementing_field.3F How do I create a serial/auto-incrementing field?] in the PostgreSQL FAQ<br /> <br /> === The Explicit Way: &lt;code&gt;SEQUENCE&lt;/code&gt; ===<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Definition ====<br /> CREATE SEQUENCE myseq;<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Usage ====<br /> '''either''' as the column's default value:<br /> CREATE TABLE table_name (<br /> Identifier NUMBER DEFAULT nextval('myseq'),<br /> -- ...<br /> );<br /> '''or''' explicitly each time you insert a new row:<br /> INSERT ... INTO table_name VALUES(nextval('myseq'), 'Name', ...);<br /> <br /> == MySQL's &lt;code&gt;INT UNSIGNED&lt;/code&gt; (Cardinal) ==<br /> * MySQL: &lt;code&gt;column INT UNSIGNED&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;column INT CHECK (column &gt; 0)&lt;/code&gt;<br /> <br /> == MySQL's Index Type ==<br /> * MySQL: &lt;code&gt;INDEX idx_id(id)&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;CREATE INDEX idx_id ON TABLENAME(id);&lt;/code&gt;<br /> <br /> == MySQL's Query Resultset Limit ==<br /> * MySQL: &lt;code&gt;SELECT * FROM tbl LIMIT 10, 5&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;SELECT * FROM tbl LIMIT 5 OFFSET 10&lt;/code&gt;<br /> <br /> == Data types of MySQL versus PostgreSQL ==<br /> <br /> {| class=&quot;mw-datatable&quot;<br /> |-<br /> ! colspan=2 | Mysql !! colspan=2 | PostgreSQL!! <br /> |-<br /> ! Typ !! Beschreibung !! Typ !! Beschreibung <br /> |-<br /> | tinyint || -128..127 || - || - <br /> |-<br /> | smallint || -32768..+32767 || int2 || -32767 ... +32768 <br /> |-<br /> | int || -2147483648.. +2147483647 || int4 || -2147483648 ... +2147483647 <br /> |-<br /> | || || int8 || +/- 18 Dezimalstellen <br /> |-<br /> | float(n) || n E {4;8}, Einf./doppelte Genauig.|| float4 || 6 Dez.Stellen<br /> |-<br /> | || || float8 || 15 Dezimalstellen <br /> |-<br /> | date || YYYY-MM-DD Datumsformat || date || Datum, Datumformate mit SET DATESTYLE=Value einstellbar <br /> |-<br /> | time || HH-MM-SS Zeitformat || time || Uhrzeit, Auflösung 1 Mikrosekunde <br /> |-<br /> | char(m) || Zeichenkette mit fester Länge || char || ein Zeichen <br /> |-<br /> | varchar(m) || variable Länge, max. m Zeichen || varchar(n) || 4+n Bytes <br /> |-<br /> | blob || Binary Large Object, wird für Texte gebraucht, &quot;TINY&quot;, &quot;&quot;, &quot;LONG&quot; || bytea <br /> |-<br /> | || || money || 4 Byte, -21474836,48 ... +21474836,47 <br /> |-<br /> | || || text || Variable Länge<br /> |-<br /> | || || bool || Kann den Wert 't' oder 'f' annehmen <br /> |}</div> Das-g https://giswiki.hsr.ch/index.php?title=PostgreSQL_for_MySQL_Users&diff=60646 PostgreSQL for MySQL Users 2017-08-30T12:37:06Z <p>Das-g: /* MySQL's AUTO INCREMENT */ also link to official FAQ about this</p> <hr /> <div>See also:<br /> * [[PostgreSQL]]<br /> <br /> Licensing: <br /> * MySQL: Dual Licensed<br /> * PostgreSQL: BSD-Style<br /> <br /> == Internet Resources ==<br /> <br /> * [https://wiki.postgresql.org/wiki/Things_to_find_out_about_when_moving_from_MySQL_to_PostgreSQL Things to find out about when moving from MySQL to PostgreSQL] (PostgreSQL wiki)<br /> * [https://opslife.org/postgresql-for-mysql-administrators/ PostgreSQL for MySQL Administrators] (opslife blog)<br /> * [http://www.coderholic.com/postgresql-for-mysql-users/ PostgreSQL for MySQL users] (coderholic blog)<br /> * [http://stackoverflow.com/questions/772111/switching-from-mysql-to-postgresql-tips-tricks-and-gotchas Switching from MySQL to PostgreSQL - tips, tricks and gotchas?] on StackOverflow<br /> <br /> == MySQL's &lt;code&gt;INSERT UPDATE&lt;/code&gt; ==<br /> Option 1) Write a function like:<br /> CREATE FUNCTION doinsert(_id integer, _value text) RETURNS void AS $$<br /> BEGIN<br /> UPDATE thetable SET value = _value WHERE id = _id;<br /> IF NOT FOUND THEN<br /> INSERT INTO thetable(id, value) VALUES (_id, _value);<br /> END IF<br /> END;<br /> $$ LANGUAGE plpgsql;<br /> <br /> Option 2) Use two SQL statements:<br /> -- update the existing<br /> UPDATE realTable SET VALUE = (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id)<br /> WHERE EXISTS (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id);<br /> -- insert the missing<br /> INSERT INTO realTable(id, value)<br /> SELECT id, value FROM tmp WHERE NOT EXISTS(SELECT 1 FROM realTable WHERE tmp.id = realTable.id);<br /> <br /> == MySQL's &lt;code&gt;AUTO INCREMENT&lt;/code&gt; ==<br /> * Oracle: &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> * MySQL: &lt;code&gt;id INT UNSIGNED NOT NULL AUTO_INCREMENT&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;id SERIAL&lt;/code&gt; oder &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> <br /> === Syntactic sugar: &lt;code&gt;SERIAL&lt;/code&gt; ===<br /> CREATE TABLE table_name (<br /> Identifier SERIAL,<br /> -- ...<br /> );<br /> <br /> See also<br /> * [https://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL Serial Types] in the PostgreSQL documentation<br /> * [https://wiki.postgresql.org/wiki/FAQ#How_do_I_create_a_serial.2Fauto-incrementing_field.3F How do I create a serial/auto-incrementing field?] in the PostgreSQL FAQ<br /> <br /> === The Explicit Way: &lt;code&gt;SEQUENCE&lt;/code&gt; ===<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Definition ====<br /> CREATE SEQUENCE myseq;<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Usage ====<br /> '''either''' as the column's default value:<br /> CREATE TABLE table_name (<br /> Identifier NUMBER DEFAULT nextval('myseq'),<br /> -- ...<br /> );<br /> '''or''' explicitly each time you insert a new row:<br /> INSERT ... INTO table_name VALUES(nextval('myseq'), 'Name', ...);<br /> <br /> == MySQL's &lt;code&gt;INT UNSIGNED&lt;/code&gt; (Cardinal) ==<br /> * MySQL: &lt;code&gt;column INT UNSIGNED&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;column INT CHECK (column &gt; 0)&lt;/code&gt;<br /> <br /> == MySQL's Index Type ==<br /> * MySQL: &lt;code&gt;INDEX idx_id(id)&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;CREATE INDEX idx_id ON TABLENAME(id);&lt;/code&gt;<br /> <br /> == MySQL's Query Resultset Limit ==<br /> * MySQL: &lt;code&gt;SELECT * FROM tbl LIMIT 10, 5&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;SELECT * FROM tbl LIMIT 5 OFFSET 10&lt;/code&gt;<br /> <br /> == Data types of MySQL versus PostgreSQL ==<br /> <br /> {| class=&quot;mw-datatable&quot;<br /> |-<br /> ! colspan=2 | Mysql !! colspan=2 | PostgreSQL!! <br /> |-<br /> ! Typ !! Beschreibung !! Typ !! Beschreibung <br /> |-<br /> | tinyint || -128..127 || - || - <br /> |-<br /> | smallint || -32768..+32767 || int2 || -32767 ... +32768 <br /> |-<br /> | int || -2147483648.. +2147483647 || int4 || -2147483648 ... +2147483647 <br /> |-<br /> | || || int8 || +/- 18 Dezimalstellen <br /> |-<br /> | float(n) || n E {4;8}, Einf./doppelte Genauig.|| float4 || 6 Dez.Stellen<br /> |-<br /> | || || float8 || 15 Dezimalstellen <br /> |-<br /> | date || YYYY-MM-DD Datumsformat || date || Datum, Datumformate mit SET DATESTYLE=Value einstellbar <br /> |-<br /> | time || HH-MM-SS Zeitformat || time || Uhrzeit, Auflösung 1 Mikrosekunde <br /> |-<br /> | char(m) || Zeichenkette mit fester Länge || char || ein Zeichen <br /> |-<br /> | varchar(m) || variable Länge, max. m Zeichen || varchar(n) || 4+n Bytes <br /> |-<br /> | blob || Binary Large Object, wird für Texte gebraucht, &quot;TINY&quot;, &quot;&quot;, &quot;LONG&quot; || bytea <br /> |-<br /> | || || money || 4 Byte, -21474836,48 ... +21474836,47 <br /> |-<br /> | || || text || Variable Länge<br /> |-<br /> | || || bool || Kann den Wert 't' oder 'f' annehmen <br /> |}</div> Das-g https://giswiki.hsr.ch/index.php?title=PostgreSQL_for_MySQL_Users&diff=60645 PostgreSQL for MySQL Users 2017-08-30T12:35:18Z <p>Das-g: /* MySQL's AUTO INCREMENT */ move link to appropriate subsection</p> <hr /> <div>See also:<br /> * [[PostgreSQL]]<br /> <br /> Licensing: <br /> * MySQL: Dual Licensed<br /> * PostgreSQL: BSD-Style<br /> <br /> == Internet Resources ==<br /> <br /> * [https://wiki.postgresql.org/wiki/Things_to_find_out_about_when_moving_from_MySQL_to_PostgreSQL Things to find out about when moving from MySQL to PostgreSQL] (PostgreSQL wiki)<br /> * [https://opslife.org/postgresql-for-mysql-administrators/ PostgreSQL for MySQL Administrators] (opslife blog)<br /> * [http://www.coderholic.com/postgresql-for-mysql-users/ PostgreSQL for MySQL users] (coderholic blog)<br /> * [http://stackoverflow.com/questions/772111/switching-from-mysql-to-postgresql-tips-tricks-and-gotchas Switching from MySQL to PostgreSQL - tips, tricks and gotchas?] on StackOverflow<br /> <br /> == MySQL's &lt;code&gt;INSERT UPDATE&lt;/code&gt; ==<br /> Option 1) Write a function like:<br /> CREATE FUNCTION doinsert(_id integer, _value text) RETURNS void AS $$<br /> BEGIN<br /> UPDATE thetable SET value = _value WHERE id = _id;<br /> IF NOT FOUND THEN<br /> INSERT INTO thetable(id, value) VALUES (_id, _value);<br /> END IF<br /> END;<br /> $$ LANGUAGE plpgsql;<br /> <br /> Option 2) Use two SQL statements:<br /> -- update the existing<br /> UPDATE realTable SET VALUE = (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id)<br /> WHERE EXISTS (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id);<br /> -- insert the missing<br /> INSERT INTO realTable(id, value)<br /> SELECT id, value FROM tmp WHERE NOT EXISTS(SELECT 1 FROM realTable WHERE tmp.id = realTable.id);<br /> <br /> == MySQL's &lt;code&gt;AUTO INCREMENT&lt;/code&gt; ==<br /> * Oracle: &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> * MySQL: &lt;code&gt;id INT UNSIGNED NOT NULL AUTO_INCREMENT&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;id SERIAL&lt;/code&gt; oder &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> <br /> === Syntactic sugar: &lt;code&gt;SERIAL&lt;/code&gt; ===<br /> CREATE TABLE table_name (<br /> Identifier SERIAL,<br /> -- ...<br /> );<br /> <br /> * See also [https://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL Serial Types] in the PostgreSQL documentation<br /> <br /> === The Explicit Way: &lt;code&gt;SEQUENCE&lt;/code&gt; ===<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Definition ====<br /> CREATE SEQUENCE myseq;<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Usage ====<br /> '''either''' as the column's default value:<br /> CREATE TABLE table_name (<br /> Identifier NUMBER DEFAULT nextval('myseq'),<br /> -- ...<br /> );<br /> '''or''' explicitly each time you insert a new row:<br /> INSERT ... INTO table_name VALUES(nextval('myseq'), 'Name', ...);<br /> <br /> == MySQL's &lt;code&gt;INT UNSIGNED&lt;/code&gt; (Cardinal) ==<br /> * MySQL: &lt;code&gt;column INT UNSIGNED&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;column INT CHECK (column &gt; 0)&lt;/code&gt;<br /> <br /> == MySQL's Index Type ==<br /> * MySQL: &lt;code&gt;INDEX idx_id(id)&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;CREATE INDEX idx_id ON TABLENAME(id);&lt;/code&gt;<br /> <br /> == MySQL's Query Resultset Limit ==<br /> * MySQL: &lt;code&gt;SELECT * FROM tbl LIMIT 10, 5&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;SELECT * FROM tbl LIMIT 5 OFFSET 10&lt;/code&gt;<br /> <br /> == Data types of MySQL versus PostgreSQL ==<br /> <br /> {| class=&quot;mw-datatable&quot;<br /> |-<br /> ! colspan=2 | Mysql !! colspan=2 | PostgreSQL!! <br /> |-<br /> ! Typ !! Beschreibung !! Typ !! Beschreibung <br /> |-<br /> | tinyint || -128..127 || - || - <br /> |-<br /> | smallint || -32768..+32767 || int2 || -32767 ... +32768 <br /> |-<br /> | int || -2147483648.. +2147483647 || int4 || -2147483648 ... +2147483647 <br /> |-<br /> | || || int8 || +/- 18 Dezimalstellen <br /> |-<br /> | float(n) || n E {4;8}, Einf./doppelte Genauig.|| float4 || 6 Dez.Stellen<br /> |-<br /> | || || float8 || 15 Dezimalstellen <br /> |-<br /> | date || YYYY-MM-DD Datumsformat || date || Datum, Datumformate mit SET DATESTYLE=Value einstellbar <br /> |-<br /> | time || HH-MM-SS Zeitformat || time || Uhrzeit, Auflösung 1 Mikrosekunde <br /> |-<br /> | char(m) || Zeichenkette mit fester Länge || char || ein Zeichen <br /> |-<br /> | varchar(m) || variable Länge, max. m Zeichen || varchar(n) || 4+n Bytes <br /> |-<br /> | blob || Binary Large Object, wird für Texte gebraucht, &quot;TINY&quot;, &quot;&quot;, &quot;LONG&quot; || bytea <br /> |-<br /> | || || money || 4 Byte, -21474836,48 ... +21474836,47 <br /> |-<br /> | || || text || Variable Länge<br /> |-<br /> | || || bool || Kann den Wert 't' oder 'f' annehmen <br /> |}</div> Das-g https://giswiki.hsr.ch/index.php?title=PostgreSQL_for_MySQL_Users&diff=60644 PostgreSQL for MySQL Users 2017-08-30T12:34:40Z <p>Das-g: /* MySQL's AUTO INCREMENT */ wikify link</p> <hr /> <div>See also:<br /> * [[PostgreSQL]]<br /> <br /> Licensing: <br /> * MySQL: Dual Licensed<br /> * PostgreSQL: BSD-Style<br /> <br /> == Internet Resources ==<br /> <br /> * [https://wiki.postgresql.org/wiki/Things_to_find_out_about_when_moving_from_MySQL_to_PostgreSQL Things to find out about when moving from MySQL to PostgreSQL] (PostgreSQL wiki)<br /> * [https://opslife.org/postgresql-for-mysql-administrators/ PostgreSQL for MySQL Administrators] (opslife blog)<br /> * [http://www.coderholic.com/postgresql-for-mysql-users/ PostgreSQL for MySQL users] (coderholic blog)<br /> * [http://stackoverflow.com/questions/772111/switching-from-mysql-to-postgresql-tips-tricks-and-gotchas Switching from MySQL to PostgreSQL - tips, tricks and gotchas?] on StackOverflow<br /> <br /> == MySQL's &lt;code&gt;INSERT UPDATE&lt;/code&gt; ==<br /> Option 1) Write a function like:<br /> CREATE FUNCTION doinsert(_id integer, _value text) RETURNS void AS $$<br /> BEGIN<br /> UPDATE thetable SET value = _value WHERE id = _id;<br /> IF NOT FOUND THEN<br /> INSERT INTO thetable(id, value) VALUES (_id, _value);<br /> END IF<br /> END;<br /> $$ LANGUAGE plpgsql;<br /> <br /> Option 2) Use two SQL statements:<br /> -- update the existing<br /> UPDATE realTable SET VALUE = (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id)<br /> WHERE EXISTS (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id);<br /> -- insert the missing<br /> INSERT INTO realTable(id, value)<br /> SELECT id, value FROM tmp WHERE NOT EXISTS(SELECT 1 FROM realTable WHERE tmp.id = realTable.id);<br /> <br /> == MySQL's &lt;code&gt;AUTO INCREMENT&lt;/code&gt; ==<br /> * Oracle: &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> * MySQL: &lt;code&gt;id INT UNSIGNED NOT NULL AUTO_INCREMENT&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;id SERIAL&lt;/code&gt; oder &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> <br /> === Syntactic sugar: &lt;code&gt;SERIAL&lt;/code&gt; ===<br /> CREATE TABLE table_name (<br /> Identifier SERIAL,<br /> -- ...<br /> );<br /> <br /> === The Explicit Way: &lt;code&gt;SEQUENCE&lt;/code&gt; ===<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Definition ====<br /> CREATE SEQUENCE myseq;<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Usage ====<br /> '''either''' as the column's default value:<br /> CREATE TABLE table_name (<br /> Identifier NUMBER DEFAULT nextval('myseq'),<br /> -- ...<br /> );<br /> '''or''' explicitly each time you insert a new row:<br /> INSERT ... INTO table_name VALUES(nextval('myseq'), 'Name', ...);<br /> <br /> * See also [https://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL Serial Types] in the PostgreSQL documentation<br /> <br /> == MySQL's &lt;code&gt;INT UNSIGNED&lt;/code&gt; (Cardinal) ==<br /> * MySQL: &lt;code&gt;column INT UNSIGNED&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;column INT CHECK (column &gt; 0)&lt;/code&gt;<br /> <br /> == MySQL's Index Type ==<br /> * MySQL: &lt;code&gt;INDEX idx_id(id)&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;CREATE INDEX idx_id ON TABLENAME(id);&lt;/code&gt;<br /> <br /> == MySQL's Query Resultset Limit ==<br /> * MySQL: &lt;code&gt;SELECT * FROM tbl LIMIT 10, 5&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;SELECT * FROM tbl LIMIT 5 OFFSET 10&lt;/code&gt;<br /> <br /> == Data types of MySQL versus PostgreSQL ==<br /> <br /> {| class=&quot;mw-datatable&quot;<br /> |-<br /> ! colspan=2 | Mysql !! colspan=2 | PostgreSQL!! <br /> |-<br /> ! Typ !! Beschreibung !! Typ !! Beschreibung <br /> |-<br /> | tinyint || -128..127 || - || - <br /> |-<br /> | smallint || -32768..+32767 || int2 || -32767 ... +32768 <br /> |-<br /> | int || -2147483648.. +2147483647 || int4 || -2147483648 ... +2147483647 <br /> |-<br /> | || || int8 || +/- 18 Dezimalstellen <br /> |-<br /> | float(n) || n E {4;8}, Einf./doppelte Genauig.|| float4 || 6 Dez.Stellen<br /> |-<br /> | || || float8 || 15 Dezimalstellen <br /> |-<br /> | date || YYYY-MM-DD Datumsformat || date || Datum, Datumformate mit SET DATESTYLE=Value einstellbar <br /> |-<br /> | time || HH-MM-SS Zeitformat || time || Uhrzeit, Auflösung 1 Mikrosekunde <br /> |-<br /> | char(m) || Zeichenkette mit fester Länge || char || ein Zeichen <br /> |-<br /> | varchar(m) || variable Länge, max. m Zeichen || varchar(n) || 4+n Bytes <br /> |-<br /> | blob || Binary Large Object, wird für Texte gebraucht, &quot;TINY&quot;, &quot;&quot;, &quot;LONG&quot; || bytea <br /> |-<br /> | || || money || 4 Byte, -21474836,48 ... +21474836,47 <br /> |-<br /> | || || text || Variable Länge<br /> |-<br /> | || || bool || Kann den Wert 't' oder 'f' annehmen <br /> |}</div> Das-g https://giswiki.hsr.ch/index.php?title=PostgreSQL_for_MySQL_Users&diff=60643 PostgreSQL for MySQL Users 2017-08-30T12:32:52Z <p>Das-g: /* MySQL's AUTO INCREMENT */ remove dead link</p> <hr /> <div>See also:<br /> * [[PostgreSQL]]<br /> <br /> Licensing: <br /> * MySQL: Dual Licensed<br /> * PostgreSQL: BSD-Style<br /> <br /> == Internet Resources ==<br /> <br /> * [https://wiki.postgresql.org/wiki/Things_to_find_out_about_when_moving_from_MySQL_to_PostgreSQL Things to find out about when moving from MySQL to PostgreSQL] (PostgreSQL wiki)<br /> * [https://opslife.org/postgresql-for-mysql-administrators/ PostgreSQL for MySQL Administrators] (opslife blog)<br /> * [http://www.coderholic.com/postgresql-for-mysql-users/ PostgreSQL for MySQL users] (coderholic blog)<br /> * [http://stackoverflow.com/questions/772111/switching-from-mysql-to-postgresql-tips-tricks-and-gotchas Switching from MySQL to PostgreSQL - tips, tricks and gotchas?] on StackOverflow<br /> <br /> == MySQL's &lt;code&gt;INSERT UPDATE&lt;/code&gt; ==<br /> Option 1) Write a function like:<br /> CREATE FUNCTION doinsert(_id integer, _value text) RETURNS void AS $$<br /> BEGIN<br /> UPDATE thetable SET value = _value WHERE id = _id;<br /> IF NOT FOUND THEN<br /> INSERT INTO thetable(id, value) VALUES (_id, _value);<br /> END IF<br /> END;<br /> $$ LANGUAGE plpgsql;<br /> <br /> Option 2) Use two SQL statements:<br /> -- update the existing<br /> UPDATE realTable SET VALUE = (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id)<br /> WHERE EXISTS (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id);<br /> -- insert the missing<br /> INSERT INTO realTable(id, value)<br /> SELECT id, value FROM tmp WHERE NOT EXISTS(SELECT 1 FROM realTable WHERE tmp.id = realTable.id);<br /> <br /> == MySQL's &lt;code&gt;AUTO INCREMENT&lt;/code&gt; ==<br /> * Oracle: &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> * MySQL: &lt;code&gt;id INT UNSIGNED NOT NULL AUTO_INCREMENT&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;id SERIAL&lt;/code&gt; oder &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> <br /> === Syntactic sugar: &lt;code&gt;SERIAL&lt;/code&gt; ===<br /> CREATE TABLE table_name (<br /> Identifier SERIAL,<br /> -- ...<br /> );<br /> <br /> === The Explicit Way: &lt;code&gt;SEQUENCE&lt;/code&gt; ===<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Definition ====<br /> CREATE SEQUENCE myseq;<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Usage ====<br /> '''either''' as the column's default value:<br /> CREATE TABLE table_name (<br /> Identifier NUMBER DEFAULT nextval('myseq'),<br /> -- ...<br /> );<br /> '''or''' explicitly each time you insert a new row:<br /> INSERT ... INTO table_name VALUES(nextval('myseq'), 'Name', ...);<br /> <br /> * See also [https://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL 1]<br /> <br /> == MySQL's &lt;code&gt;INT UNSIGNED&lt;/code&gt; (Cardinal) ==<br /> * MySQL: &lt;code&gt;column INT UNSIGNED&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;column INT CHECK (column &gt; 0)&lt;/code&gt;<br /> <br /> == MySQL's Index Type ==<br /> * MySQL: &lt;code&gt;INDEX idx_id(id)&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;CREATE INDEX idx_id ON TABLENAME(id);&lt;/code&gt;<br /> <br /> == MySQL's Query Resultset Limit ==<br /> * MySQL: &lt;code&gt;SELECT * FROM tbl LIMIT 10, 5&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;SELECT * FROM tbl LIMIT 5 OFFSET 10&lt;/code&gt;<br /> <br /> == Data types of MySQL versus PostgreSQL ==<br /> <br /> {| class=&quot;mw-datatable&quot;<br /> |-<br /> ! colspan=2 | Mysql !! colspan=2 | PostgreSQL!! <br /> |-<br /> ! Typ !! Beschreibung !! Typ !! Beschreibung <br /> |-<br /> | tinyint || -128..127 || - || - <br /> |-<br /> | smallint || -32768..+32767 || int2 || -32767 ... +32768 <br /> |-<br /> | int || -2147483648.. +2147483647 || int4 || -2147483648 ... +2147483647 <br /> |-<br /> | || || int8 || +/- 18 Dezimalstellen <br /> |-<br /> | float(n) || n E {4;8}, Einf./doppelte Genauig.|| float4 || 6 Dez.Stellen<br /> |-<br /> | || || float8 || 15 Dezimalstellen <br /> |-<br /> | date || YYYY-MM-DD Datumsformat || date || Datum, Datumformate mit SET DATESTYLE=Value einstellbar <br /> |-<br /> | time || HH-MM-SS Zeitformat || time || Uhrzeit, Auflösung 1 Mikrosekunde <br /> |-<br /> | char(m) || Zeichenkette mit fester Länge || char || ein Zeichen <br /> |-<br /> | varchar(m) || variable Länge, max. m Zeichen || varchar(n) || 4+n Bytes <br /> |-<br /> | blob || Binary Large Object, wird für Texte gebraucht, &quot;TINY&quot;, &quot;&quot;, &quot;LONG&quot; || bytea <br /> |-<br /> | || || money || 4 Byte, -21474836,48 ... +21474836,47 <br /> |-<br /> | || || text || Variable Länge<br /> |-<br /> | || || bool || Kann den Wert 't' oder 'f' annehmen <br /> |}</div> Das-g https://giswiki.hsr.ch/index.php?title=PostgreSQL_for_MySQL_Users&diff=60642 PostgreSQL for MySQL Users 2017-08-30T12:32:31Z <p>Das-g: /* MySQL's AUTO INCREMENT */ link to docs of current PostgreSQL version</p> <hr /> <div>See also:<br /> * [[PostgreSQL]]<br /> <br /> Licensing: <br /> * MySQL: Dual Licensed<br /> * PostgreSQL: BSD-Style<br /> <br /> == Internet Resources ==<br /> <br /> * [https://wiki.postgresql.org/wiki/Things_to_find_out_about_when_moving_from_MySQL_to_PostgreSQL Things to find out about when moving from MySQL to PostgreSQL] (PostgreSQL wiki)<br /> * [https://opslife.org/postgresql-for-mysql-administrators/ PostgreSQL for MySQL Administrators] (opslife blog)<br /> * [http://www.coderholic.com/postgresql-for-mysql-users/ PostgreSQL for MySQL users] (coderholic blog)<br /> * [http://stackoverflow.com/questions/772111/switching-from-mysql-to-postgresql-tips-tricks-and-gotchas Switching from MySQL to PostgreSQL - tips, tricks and gotchas?] on StackOverflow<br /> <br /> == MySQL's &lt;code&gt;INSERT UPDATE&lt;/code&gt; ==<br /> Option 1) Write a function like:<br /> CREATE FUNCTION doinsert(_id integer, _value text) RETURNS void AS $$<br /> BEGIN<br /> UPDATE thetable SET value = _value WHERE id = _id;<br /> IF NOT FOUND THEN<br /> INSERT INTO thetable(id, value) VALUES (_id, _value);<br /> END IF<br /> END;<br /> $$ LANGUAGE plpgsql;<br /> <br /> Option 2) Use two SQL statements:<br /> -- update the existing<br /> UPDATE realTable SET VALUE = (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id)<br /> WHERE EXISTS (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id);<br /> -- insert the missing<br /> INSERT INTO realTable(id, value)<br /> SELECT id, value FROM tmp WHERE NOT EXISTS(SELECT 1 FROM realTable WHERE tmp.id = realTable.id);<br /> <br /> == MySQL's &lt;code&gt;AUTO INCREMENT&lt;/code&gt; ==<br /> * Oracle: &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> * MySQL: &lt;code&gt;id INT UNSIGNED NOT NULL AUTO_INCREMENT&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;id SERIAL&lt;/code&gt; oder &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> <br /> === Syntactic sugar: &lt;code&gt;SERIAL&lt;/code&gt; ===<br /> CREATE TABLE table_name (<br /> Identifier SERIAL,<br /> -- ...<br /> );<br /> <br /> === The Explicit Way: &lt;code&gt;SEQUENCE&lt;/code&gt; ===<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Definition ====<br /> CREATE SEQUENCE myseq;<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Usage ====<br /> '''either''' as the column's default value:<br /> CREATE TABLE table_name (<br /> Identifier NUMBER DEFAULT nextval('myseq'),<br /> -- ...<br /> );<br /> '''or''' explicitly each time you insert a new row:<br /> INSERT ... INTO table_name VALUES(nextval('myseq'), 'Name', ...);<br /> <br /> * See also [https://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL 1] and [http://www.frankhilliard.com/serialstory.cfm 2]<br /> <br /> == MySQL's &lt;code&gt;INT UNSIGNED&lt;/code&gt; (Cardinal) ==<br /> * MySQL: &lt;code&gt;column INT UNSIGNED&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;column INT CHECK (column &gt; 0)&lt;/code&gt;<br /> <br /> == MySQL's Index Type ==<br /> * MySQL: &lt;code&gt;INDEX idx_id(id)&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;CREATE INDEX idx_id ON TABLENAME(id);&lt;/code&gt;<br /> <br /> == MySQL's Query Resultset Limit ==<br /> * MySQL: &lt;code&gt;SELECT * FROM tbl LIMIT 10, 5&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;SELECT * FROM tbl LIMIT 5 OFFSET 10&lt;/code&gt;<br /> <br /> == Data types of MySQL versus PostgreSQL ==<br /> <br /> {| class=&quot;mw-datatable&quot;<br /> |-<br /> ! colspan=2 | Mysql !! colspan=2 | PostgreSQL!! <br /> |-<br /> ! Typ !! Beschreibung !! Typ !! Beschreibung <br /> |-<br /> | tinyint || -128..127 || - || - <br /> |-<br /> | smallint || -32768..+32767 || int2 || -32767 ... +32768 <br /> |-<br /> | int || -2147483648.. +2147483647 || int4 || -2147483648 ... +2147483647 <br /> |-<br /> | || || int8 || +/- 18 Dezimalstellen <br /> |-<br /> | float(n) || n E {4;8}, Einf./doppelte Genauig.|| float4 || 6 Dez.Stellen<br /> |-<br /> | || || float8 || 15 Dezimalstellen <br /> |-<br /> | date || YYYY-MM-DD Datumsformat || date || Datum, Datumformate mit SET DATESTYLE=Value einstellbar <br /> |-<br /> | time || HH-MM-SS Zeitformat || time || Uhrzeit, Auflösung 1 Mikrosekunde <br /> |-<br /> | char(m) || Zeichenkette mit fester Länge || char || ein Zeichen <br /> |-<br /> | varchar(m) || variable Länge, max. m Zeichen || varchar(n) || 4+n Bytes <br /> |-<br /> | blob || Binary Large Object, wird für Texte gebraucht, &quot;TINY&quot;, &quot;&quot;, &quot;LONG&quot; || bytea <br /> |-<br /> | || || money || 4 Byte, -21474836,48 ... +21474836,47 <br /> |-<br /> | || || text || Variable Länge<br /> |-<br /> | || || bool || Kann den Wert 't' oder 'f' annehmen <br /> |}</div> Das-g https://giswiki.hsr.ch/index.php?title=PostgreSQL_for_MySQL_Users&diff=60641 PostgreSQL for MySQL Users 2017-08-30T12:09:14Z <p>Das-g: Einheitliche Sprache für diese Wiki-Seite: Englisch</p> <hr /> <div>See also:<br /> * [[PostgreSQL]]<br /> <br /> Licensing: <br /> * MySQL: Dual Licensed<br /> * PostgreSQL: BSD-Style<br /> <br /> == Internet Resources ==<br /> <br /> * [https://wiki.postgresql.org/wiki/Things_to_find_out_about_when_moving_from_MySQL_to_PostgreSQL Things to find out about when moving from MySQL to PostgreSQL] (PostgreSQL wiki)<br /> * [https://opslife.org/postgresql-for-mysql-administrators/ PostgreSQL for MySQL Administrators] (opslife blog)<br /> * [http://www.coderholic.com/postgresql-for-mysql-users/ PostgreSQL for MySQL users] (coderholic blog)<br /> * [http://stackoverflow.com/questions/772111/switching-from-mysql-to-postgresql-tips-tricks-and-gotchas Switching from MySQL to PostgreSQL - tips, tricks and gotchas?] on StackOverflow<br /> <br /> == MySQL's &lt;code&gt;INSERT UPDATE&lt;/code&gt; ==<br /> Option 1) Write a function like:<br /> CREATE FUNCTION doinsert(_id integer, _value text) RETURNS void AS $$<br /> BEGIN<br /> UPDATE thetable SET value = _value WHERE id = _id;<br /> IF NOT FOUND THEN<br /> INSERT INTO thetable(id, value) VALUES (_id, _value);<br /> END IF<br /> END;<br /> $$ LANGUAGE plpgsql;<br /> <br /> Option 2) Use two SQL statements:<br /> -- update the existing<br /> UPDATE realTable SET VALUE = (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id)<br /> WHERE EXISTS (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id);<br /> -- insert the missing<br /> INSERT INTO realTable(id, value)<br /> SELECT id, value FROM tmp WHERE NOT EXISTS(SELECT 1 FROM realTable WHERE tmp.id = realTable.id);<br /> <br /> == MySQL's &lt;code&gt;AUTO INCREMENT&lt;/code&gt; ==<br /> * Oracle: &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> * MySQL: &lt;code&gt;id INT UNSIGNED NOT NULL AUTO_INCREMENT&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;id SERIAL&lt;/code&gt; oder &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> <br /> === Syntactic sugar: &lt;code&gt;SERIAL&lt;/code&gt; ===<br /> CREATE TABLE table_name (<br /> Identifier SERIAL,<br /> -- ...<br /> );<br /> <br /> === The Explicit Way: &lt;code&gt;SEQUENCE&lt;/code&gt; ===<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Definition ====<br /> CREATE SEQUENCE myseq;<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Usage ====<br /> '''either''' as the column's default value:<br /> CREATE TABLE table_name (<br /> Identifier NUMBER DEFAULT nextval('myseq'),<br /> -- ...<br /> );<br /> '''or''' explicitly each time you insert a new row:<br /> INSERT ... INTO table_name VALUES(nextval('myseq'), 'Name', ...);<br /> <br /> * See also [http://www.postgresql.org/docs/8.0/static/datatype.html#DATATYPE-SERIAL 1] and [http://www.frankhilliard.com/serialstory.cfm 2]<br /> <br /> == MySQL's &lt;code&gt;INT UNSIGNED&lt;/code&gt; (Cardinal) ==<br /> * MySQL: &lt;code&gt;column INT UNSIGNED&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;column INT CHECK (column &gt; 0)&lt;/code&gt;<br /> <br /> == MySQL's Index Type ==<br /> * MySQL: &lt;code&gt;INDEX idx_id(id)&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;CREATE INDEX idx_id ON TABLENAME(id);&lt;/code&gt;<br /> <br /> == MySQL's Query Resultset Limit ==<br /> * MySQL: &lt;code&gt;SELECT * FROM tbl LIMIT 10, 5&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;SELECT * FROM tbl LIMIT 5 OFFSET 10&lt;/code&gt;<br /> <br /> == Data types of MySQL versus PostgreSQL ==<br /> <br /> {| class=&quot;mw-datatable&quot;<br /> |-<br /> ! colspan=2 | Mysql !! colspan=2 | PostgreSQL!! <br /> |-<br /> ! Typ !! Beschreibung !! Typ !! Beschreibung <br /> |-<br /> | tinyint || -128..127 || - || - <br /> |-<br /> | smallint || -32768..+32767 || int2 || -32767 ... +32768 <br /> |-<br /> | int || -2147483648.. +2147483647 || int4 || -2147483648 ... +2147483647 <br /> |-<br /> | || || int8 || +/- 18 Dezimalstellen <br /> |-<br /> | float(n) || n E {4;8}, Einf./doppelte Genauig.|| float4 || 6 Dez.Stellen<br /> |-<br /> | || || float8 || 15 Dezimalstellen <br /> |-<br /> | date || YYYY-MM-DD Datumsformat || date || Datum, Datumformate mit SET DATESTYLE=Value einstellbar <br /> |-<br /> | time || HH-MM-SS Zeitformat || time || Uhrzeit, Auflösung 1 Mikrosekunde <br /> |-<br /> | char(m) || Zeichenkette mit fester Länge || char || ein Zeichen <br /> |-<br /> | varchar(m) || variable Länge, max. m Zeichen || varchar(n) || 4+n Bytes <br /> |-<br /> | blob || Binary Large Object, wird für Texte gebraucht, &quot;TINY&quot;, &quot;&quot;, &quot;LONG&quot; || bytea <br /> |-<br /> | || || money || 4 Byte, -21474836,48 ... +21474836,47 <br /> |-<br /> | || || text || Variable Länge<br /> |-<br /> | || || bool || Kann den Wert 't' oder 'f' annehmen <br /> |}</div> Das-g https://giswiki.hsr.ch/index.php?title=PostgreSQL_for_MySQL_Users&diff=60639 PostgreSQL for MySQL Users 2017-08-29T13:19:22Z <p>Das-g: mark up SQL keywords &amp; SQL code in prose</p> <hr /> <div>Siehe auch:<br /> * [[PostgreSQL]]<br /> <br /> Licensing: <br /> * MySQL: Dual Licensed<br /> * PostgreSQL: BSD-Style<br /> <br /> == Internet Resources ==<br /> <br /> * [https://wiki.postgresql.org/wiki/Things_to_find_out_about_when_moving_from_MySQL_to_PostgreSQL Things to find out about when moving from MySQL to PostgreSQL] (PostgreSQL wiki)<br /> * [https://opslife.org/postgresql-for-mysql-administrators/ PostgreSQL for MySQL Administrators] (opslife blog)<br /> * [http://www.coderholic.com/postgresql-for-mysql-users/ PostgreSQL for MySQL users] (coderholic blog)<br /> * [http://stackoverflow.com/questions/772111/switching-from-mysql-to-postgresql-tips-tricks-and-gotchas Switching from MySQL to PostgreSQL - tips, tricks and gotchas?] on StackOverflow<br /> <br /> == MySQL's &lt;code&gt;INSERT UPDATE&lt;/code&gt; ==<br /> Option 1) Write a function like:<br /> CREATE FUNCTION doinsert(_id integer, _value text) RETURNS void AS $$<br /> BEGIN<br /> UPDATE thetable SET value = _value WHERE id = _id;<br /> IF NOT FOUND THEN<br /> INSERT INTO thetable(id, value) VALUES (_id, _value);<br /> END IF<br /> END;<br /> $$ LANGUAGE plpgsql;<br /> <br /> Option 2) Use two SQL statements:<br /> -- update the existing<br /> UPDATE realTable SET VALUE = (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id)<br /> WHERE EXISTS (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id);<br /> -- insert the missing<br /> INSERT INTO realTable(id, value)<br /> SELECT id, value FROM tmp WHERE NOT EXISTS(SELECT 1 FROM realTable WHERE tmp.id = realTable.id);<br /> <br /> == MySQL's &lt;code&gt;AUTO INCREMENT&lt;/code&gt; ==<br /> * Oracle: &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> * MySQL: &lt;code&gt;id INT UNSIGNED NOT NULL AUTO_INCREMENT&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;id SERIAL&lt;/code&gt; oder &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> <br /> === Syntactic sugar: &lt;code&gt;SERIAL&lt;/code&gt; ===<br /> CREATE TABLE table_name (<br /> Identifier SERIAL,<br /> -- ...<br /> );<br /> <br /> === Explizite Variante: &lt;code&gt;SEQUENCE&lt;/code&gt; ===<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Definition ====<br /> CREATE SEQUENCE myseq;<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Verwendung ====<br /> '''entweder''' als Standard-Wert der Spalte:<br /> CREATE TABLE table_name (<br /> Identifier NUMBER DEFAULT nextval('myseq'),<br /> -- ...<br /> );<br /> '''oder''' explizit beim Einfügen neuer Zeilen:<br /> INSERT ... INTO table_name VALUES(nextval('myseq'), 'Name', ...);<br /> <br /> * Siehe auch [http://www.postgresql.org/docs/8.0/static/datatype.html#DATATYPE-SERIAL 1] und [http://www.frankhilliard.com/serialstory.cfm 2]<br /> <br /> == MySQL's &lt;code&gt;INT UNSIGNED&lt;/code&gt; (Cardinal) ==<br /> * MySQL: &lt;code&gt;column INT UNSIGNED&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;column INT CHECK (column &gt; 0)&lt;/code&gt;<br /> <br /> == MySQL's Index-Typ ==<br /> * MySQL: &lt;code&gt;INDEX idx_id(id)&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;CREATE INDEX idx_id ON TABLENAME(id);&lt;/code&gt;<br /> <br /> == MySQL's Query Resultset Limit ==<br /> * MySQL: &lt;code&gt;SELECT * FROM tbl LIMIT 10, 5&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;SELECT * FROM tbl LIMIT 5 OFFSET 10&lt;/code&gt;<br /> <br /> == Data types of MySQL versus PostgreSQL ==<br /> <br /> {| class=&quot;mw-datatable&quot;<br /> |-<br /> ! colspan=2 | Mysql !! colspan=2 | PostgreSQL!! <br /> |-<br /> ! Typ !! Beschreibung !! Typ !! Beschreibung <br /> |-<br /> | tinyint || -128..127 || - || - <br /> |-<br /> | smallint || -32768..+32767 || int2 || -32767 ... +32768 <br /> |-<br /> | int || -2147483648.. +2147483647 || int4 || -2147483648 ... +2147483647 <br /> |-<br /> | || || int8 || +/- 18 Dezimalstellen <br /> |-<br /> | float(n) || n E {4;8}, Einf./doppelte Genauig.|| float4 || 6 Dez.Stellen<br /> |-<br /> | || || float8 || 15 Dezimalstellen <br /> |-<br /> | date || YYYY-MM-DD Datumsformat || date || Datum, Datumformate mit SET DATESTYLE=Value einstellbar <br /> |-<br /> | time || HH-MM-SS Zeitformat || time || Uhrzeit, Auflösung 1 Mikrosekunde <br /> |-<br /> | char(m) || Zeichenkette mit fester Länge || char || ein Zeichen <br /> |-<br /> | varchar(m) || variable Länge, max. m Zeichen || varchar(n) || 4+n Bytes <br /> |-<br /> | blob || Binary Large Object, wird für Texte gebraucht, &quot;TINY&quot;, &quot;&quot;, &quot;LONG&quot; || bytea <br /> |-<br /> | || || money || 4 Byte, -21474836,48 ... +21474836,47 <br /> |-<br /> | || || text || Variable Länge<br /> |-<br /> | || || bool || Kann den Wert 't' oder 'f' annehmen <br /> |}</div> Das-g https://giswiki.hsr.ch/index.php?title=PostgreSQL_for_MySQL_Users&diff=60638 PostgreSQL for MySQL Users 2017-08-29T12:00:26Z <p>Das-g: Delete section /* MySQL's DROP TABLE IF EXIST */ as that is only relevant for very old PostgreSQL versions</p> <hr /> <div>Siehe auch:<br /> * [[PostgreSQL]]<br /> <br /> Licensing: <br /> * MySQL: Dual Licensed<br /> * PostgreSQL: BSD-Style<br /> <br /> == Internet Resources ==<br /> <br /> * [https://wiki.postgresql.org/wiki/Things_to_find_out_about_when_moving_from_MySQL_to_PostgreSQL Things to find out about when moving from MySQL to PostgreSQL] (PostgreSQL wiki)<br /> * [https://opslife.org/postgresql-for-mysql-administrators/ PostgreSQL for MySQL Administrators] (opslife blog)<br /> * [http://www.coderholic.com/postgresql-for-mysql-users/ PostgreSQL for MySQL users] (coderholic blog)<br /> * [http://stackoverflow.com/questions/772111/switching-from-mysql-to-postgresql-tips-tricks-and-gotchas Switching from MySQL to PostgreSQL - tips, tricks and gotchas?] on StackOverflow<br /> <br /> == MySQL's &lt;code&gt;INSERT UPDATE&lt;/code&gt; ==<br /> Option 1) Write a function like:<br /> CREATE FUNCTION doinsert(_id integer, _value text) RETURNS void AS $$<br /> BEGIN<br /> UPDATE thetable SET value = _value WHERE id = _id;<br /> IF NOT FOUND THEN<br /> INSERT INTO thetable(id, value) VALUES (_id, _value);<br /> END IF<br /> END;<br /> $$ LANGUAGE plpgsql;<br /> <br /> Option 2) Use two SQL statements:<br /> -- update the existing<br /> UPDATE realTable SET VALUE = (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id)<br /> WHERE EXISTS (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id);<br /> -- insert the missing<br /> INSERT INTO realTable(id, value)<br /> SELECT id, value FROM tmp WHERE NOT EXISTS(SELECT 1 FROM realTable WHERE tmp.id = realTable.id);<br /> <br /> == MySQL's &lt;code&gt;AUTO INCREMENT&lt;/code&gt; ==<br /> * Oracle: &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> * MySQL: &lt;code&gt;id INT UNSIGNED NOT NULL AUTO_INCREMENT&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;id SERIAL&lt;/code&gt; oder &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> <br /> === Syntactic sugar: &lt;code&gt;SERIAL&lt;/code&gt; ===<br /> CREATE TABLE table_name (<br /> Identifier SERIAL,<br /> -- ...<br /> );<br /> <br /> === Explizite Variante: &lt;code&gt;SEQUENCE&lt;/code&gt; ===<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Definition ====<br /> CREATE SEQUENCE myseq;<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Verwendung ====<br /> '''entweder''' als Standard-Wert der Spalte:<br /> CREATE TABLE table_name (<br /> Identifier NUMBER DEFAULT nextval('myseq'),<br /> -- ...<br /> );<br /> '''oder''' explizit beim Einfügen neuer Zeilen:<br /> INSERT ... INTO table_name VALUES(nextval('myseq'), 'Name', ...);<br /> <br /> * Siehe auch [http://www.postgresql.org/docs/8.0/static/datatype.html#DATATYPE-SERIAL 1] und [http://www.frankhilliard.com/serialstory.cfm 2]<br /> <br /> == MySQL's &lt;code&gt;INT UNSIGNED&lt;/code&gt; (Cardinal) ==<br /> * MySQL: column INT UNSIGNED<br /> * PostgreSQL: column INT CHECK (column &gt; 0)<br /> <br /> == MySQL's Index-Typ ==<br /> * MySQL: INDEX idx_id(id)<br /> * PostgreSQL: CREATE INDEX idx_id ON TABLENAME(id); <br /> <br /> == MySQL's Query Resultset Limit ==<br /> * MySQL: SELECT * FROM tbl LIMIT 10, 5<br /> * PostgreSQL: SELECT * FROM tbl LIMIT 5 OFFSET 10 <br /> <br /> == Data types of MySQL versus PostgreSQL ==<br /> <br /> {| class=&quot;mw-datatable&quot;<br /> |-<br /> ! colspan=2 | Mysql !! colspan=2 | PostgreSQL!! <br /> |-<br /> ! Typ !! Beschreibung !! Typ !! Beschreibung <br /> |-<br /> | tinyint || -128..127 || - || - <br /> |-<br /> | smallint || -32768..+32767 || int2 || -32767 ... +32768 <br /> |-<br /> | int || -2147483648.. +2147483647 || int4 || -2147483648 ... +2147483647 <br /> |-<br /> | || || int8 || +/- 18 Dezimalstellen <br /> |-<br /> | float(n) || n E {4;8}, Einf./doppelte Genauig.|| float4 || 6 Dez.Stellen<br /> |-<br /> | || || float8 || 15 Dezimalstellen <br /> |-<br /> | date || YYYY-MM-DD Datumsformat || date || Datum, Datumformate mit SET DATESTYLE=Value einstellbar <br /> |-<br /> | time || HH-MM-SS Zeitformat || time || Uhrzeit, Auflösung 1 Mikrosekunde <br /> |-<br /> | char(m) || Zeichenkette mit fester Länge || char || ein Zeichen <br /> |-<br /> | varchar(m) || variable Länge, max. m Zeichen || varchar(n) || 4+n Bytes <br /> |-<br /> | blob || Binary Large Object, wird für Texte gebraucht, &quot;TINY&quot;, &quot;&quot;, &quot;LONG&quot; || bytea <br /> |-<br /> | || || money || 4 Byte, -21474836,48 ... +21474836,47 <br /> |-<br /> | || || text || Variable Länge<br /> |-<br /> | || || bool || Kann den Wert 't' oder 'f' annehmen <br /> |}</div> Das-g https://giswiki.hsr.ch/index.php?title=PostgreSQL_for_MySQL_Users&diff=60637 PostgreSQL for MySQL Users 2017-08-29T11:55:26Z <p>Das-g: /* MySQL's AUTO INCREMENT */ fix SQL syntax error: CREATE TABLE &amp; INSERT INTO erfordern einen Tabellen-Name</p> <hr /> <div>Siehe auch:<br /> * [[PostgreSQL]]<br /> <br /> Licensing: <br /> * MySQL: Dual Licensed<br /> * PostgreSQL: BSD-Style<br /> <br /> == Internet Resources ==<br /> <br /> * [https://wiki.postgresql.org/wiki/Things_to_find_out_about_when_moving_from_MySQL_to_PostgreSQL Things to find out about when moving from MySQL to PostgreSQL] (PostgreSQL wiki)<br /> * [https://opslife.org/postgresql-for-mysql-administrators/ PostgreSQL for MySQL Administrators] (opslife blog)<br /> * [http://www.coderholic.com/postgresql-for-mysql-users/ PostgreSQL for MySQL users] (coderholic blog)<br /> * [http://stackoverflow.com/questions/772111/switching-from-mysql-to-postgresql-tips-tricks-and-gotchas Switching from MySQL to PostgreSQL - tips, tricks and gotchas?] on StackOverflow<br /> <br /> == MySQL's &lt;code&gt;INSERT UPDATE&lt;/code&gt; ==<br /> Option 1) Write a function like:<br /> CREATE FUNCTION doinsert(_id integer, _value text) RETURNS void AS $$<br /> BEGIN<br /> UPDATE thetable SET value = _value WHERE id = _id;<br /> IF NOT FOUND THEN<br /> INSERT INTO thetable(id, value) VALUES (_id, _value);<br /> END IF<br /> END;<br /> $$ LANGUAGE plpgsql;<br /> <br /> Option 2) Use two SQL statements:<br /> -- update the existing<br /> UPDATE realTable SET VALUE = (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id)<br /> WHERE EXISTS (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id);<br /> -- insert the missing<br /> INSERT INTO realTable(id, value)<br /> SELECT id, value FROM tmp WHERE NOT EXISTS(SELECT 1 FROM realTable WHERE tmp.id = realTable.id);<br /> <br /> == MySQL's &lt;code&gt;AUTO INCREMENT&lt;/code&gt; ==<br /> * Oracle: &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> * MySQL: &lt;code&gt;id INT UNSIGNED NOT NULL AUTO_INCREMENT&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;id SERIAL&lt;/code&gt; oder &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> <br /> === Syntactic sugar: &lt;code&gt;SERIAL&lt;/code&gt; ===<br /> CREATE TABLE table_name (<br /> Identifier SERIAL,<br /> -- ...<br /> );<br /> <br /> === Explizite Variante: &lt;code&gt;SEQUENCE&lt;/code&gt; ===<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Definition ====<br /> CREATE SEQUENCE myseq;<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Verwendung ====<br /> '''entweder''' als Standard-Wert der Spalte:<br /> CREATE TABLE table_name (<br /> Identifier NUMBER DEFAULT nextval('myseq'),<br /> -- ...<br /> );<br /> '''oder''' explizit beim Einfügen neuer Zeilen:<br /> INSERT ... INTO table_name VALUES(nextval('myseq'), 'Name', ...);<br /> <br /> * Siehe auch [http://www.postgresql.org/docs/8.0/static/datatype.html#DATATYPE-SERIAL 1] und [http://www.frankhilliard.com/serialstory.cfm 2]<br /> <br /> == MySQL's &lt;code&gt;DROP TABLE IF EXIST&lt;/code&gt; ==<br /> * Existiert auch in PostgreSQL ab Version 8.2<br /> * Bei früheren Versionen gibt es einen Workaround:<br /> ** % select count(*) from pg_class where relname = 'mytable'<br /> ** return 1 if mytable exists, and 0 if it doesn't<br /> ** so you can run a DROP TABLE command (or not) based on the returned value.<br /> <br /> == MySQL's &lt;code&gt;INT UNSIGNED&lt;/code&gt; (Cardinal) ==<br /> * MySQL: column INT UNSIGNED<br /> * PostgreSQL: column INT CHECK (column &gt; 0)<br /> <br /> == MySQL's Index-Typ ==<br /> * MySQL: INDEX idx_id(id)<br /> * PostgreSQL: CREATE INDEX idx_id ON TABLENAME(id); <br /> <br /> == MySQL's Query Resultset Limit ==<br /> * MySQL: SELECT * FROM tbl LIMIT 10, 5<br /> * PostgreSQL: SELECT * FROM tbl LIMIT 5 OFFSET 10 <br /> <br /> == Data types of MySQL versus PostgreSQL ==<br /> <br /> {| class=&quot;mw-datatable&quot;<br /> |-<br /> ! colspan=2 | Mysql !! colspan=2 | PostgreSQL!! <br /> |-<br /> ! Typ !! Beschreibung !! Typ !! Beschreibung <br /> |-<br /> | tinyint || -128..127 || - || - <br /> |-<br /> | smallint || -32768..+32767 || int2 || -32767 ... +32768 <br /> |-<br /> | int || -2147483648.. +2147483647 || int4 || -2147483648 ... +2147483647 <br /> |-<br /> | || || int8 || +/- 18 Dezimalstellen <br /> |-<br /> | float(n) || n E {4;8}, Einf./doppelte Genauig.|| float4 || 6 Dez.Stellen<br /> |-<br /> | || || float8 || 15 Dezimalstellen <br /> |-<br /> | date || YYYY-MM-DD Datumsformat || date || Datum, Datumformate mit SET DATESTYLE=Value einstellbar <br /> |-<br /> | time || HH-MM-SS Zeitformat || time || Uhrzeit, Auflösung 1 Mikrosekunde <br /> |-<br /> | char(m) || Zeichenkette mit fester Länge || char || ein Zeichen <br /> |-<br /> | varchar(m) || variable Länge, max. m Zeichen || varchar(n) || 4+n Bytes <br /> |-<br /> | blob || Binary Large Object, wird für Texte gebraucht, &quot;TINY&quot;, &quot;&quot;, &quot;LONG&quot; || bytea <br /> |-<br /> | || || money || 4 Byte, -21474836,48 ... +21474836,47 <br /> |-<br /> | || || text || Variable Länge<br /> |-<br /> | || || bool || Kann den Wert 't' oder 'f' annehmen <br /> |}</div> Das-g https://giswiki.hsr.ch/index.php?title=PostgreSQL_for_MySQL_Users&diff=60636 PostgreSQL for MySQL Users 2017-08-29T11:53:18Z <p>Das-g: /* MySQL's AUTO INCREMENT */ fix SQL syntax error: Zwischen den Spaltendefinitionen in CREATE TABLE muss immer ein Komma, nie ein Semikolon stehen</p> <hr /> <div>Siehe auch:<br /> * [[PostgreSQL]]<br /> <br /> Licensing: <br /> * MySQL: Dual Licensed<br /> * PostgreSQL: BSD-Style<br /> <br /> == Internet Resources ==<br /> <br /> * [https://wiki.postgresql.org/wiki/Things_to_find_out_about_when_moving_from_MySQL_to_PostgreSQL Things to find out about when moving from MySQL to PostgreSQL] (PostgreSQL wiki)<br /> * [https://opslife.org/postgresql-for-mysql-administrators/ PostgreSQL for MySQL Administrators] (opslife blog)<br /> * [http://www.coderholic.com/postgresql-for-mysql-users/ PostgreSQL for MySQL users] (coderholic blog)<br /> * [http://stackoverflow.com/questions/772111/switching-from-mysql-to-postgresql-tips-tricks-and-gotchas Switching from MySQL to PostgreSQL - tips, tricks and gotchas?] on StackOverflow<br /> <br /> == MySQL's &lt;code&gt;INSERT UPDATE&lt;/code&gt; ==<br /> Option 1) Write a function like:<br /> CREATE FUNCTION doinsert(_id integer, _value text) RETURNS void AS $$<br /> BEGIN<br /> UPDATE thetable SET value = _value WHERE id = _id;<br /> IF NOT FOUND THEN<br /> INSERT INTO thetable(id, value) VALUES (_id, _value);<br /> END IF<br /> END;<br /> $$ LANGUAGE plpgsql;<br /> <br /> Option 2) Use two SQL statements:<br /> -- update the existing<br /> UPDATE realTable SET VALUE = (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id)<br /> WHERE EXISTS (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id);<br /> -- insert the missing<br /> INSERT INTO realTable(id, value)<br /> SELECT id, value FROM tmp WHERE NOT EXISTS(SELECT 1 FROM realTable WHERE tmp.id = realTable.id);<br /> <br /> == MySQL's &lt;code&gt;AUTO INCREMENT&lt;/code&gt; ==<br /> * Oracle: &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> * MySQL: &lt;code&gt;id INT UNSIGNED NOT NULL AUTO_INCREMENT&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;id SERIAL&lt;/code&gt; oder &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> <br /> === Syntactic sugar: &lt;code&gt;SERIAL&lt;/code&gt; ===<br /> CREATE TABLE (<br /> Identifier SERIAL,<br /> -- ...<br /> );<br /> <br /> === Explizite Variante: &lt;code&gt;SEQUENCE&lt;/code&gt; ===<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Definition ====<br /> CREATE SEQUENCE myseq;<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Verwendung ====<br /> '''entweder''' als Standard-Wert der Spalte:<br /> CREATE TABLE (<br /> Identifier NUMBER DEFAULT nextval('myseq'),<br /> -- ...<br /> );<br /> '''oder''' explizit beim Einfügen neuer Zeilen:<br /> INSERT ... INTO VALUES(nextval('myseq'), 'Name', ...);<br /> <br /> * Siehe auch [http://www.postgresql.org/docs/8.0/static/datatype.html#DATATYPE-SERIAL 1] und [http://www.frankhilliard.com/serialstory.cfm 2]<br /> <br /> == MySQL's &lt;code&gt;DROP TABLE IF EXIST&lt;/code&gt; ==<br /> * Existiert auch in PostgreSQL ab Version 8.2<br /> * Bei früheren Versionen gibt es einen Workaround:<br /> ** % select count(*) from pg_class where relname = 'mytable'<br /> ** return 1 if mytable exists, and 0 if it doesn't<br /> ** so you can run a DROP TABLE command (or not) based on the returned value.<br /> <br /> == MySQL's &lt;code&gt;INT UNSIGNED&lt;/code&gt; (Cardinal) ==<br /> * MySQL: column INT UNSIGNED<br /> * PostgreSQL: column INT CHECK (column &gt; 0)<br /> <br /> == MySQL's Index-Typ ==<br /> * MySQL: INDEX idx_id(id)<br /> * PostgreSQL: CREATE INDEX idx_id ON TABLENAME(id); <br /> <br /> == MySQL's Query Resultset Limit ==<br /> * MySQL: SELECT * FROM tbl LIMIT 10, 5<br /> * PostgreSQL: SELECT * FROM tbl LIMIT 5 OFFSET 10 <br /> <br /> == Data types of MySQL versus PostgreSQL ==<br /> <br /> {| class=&quot;mw-datatable&quot;<br /> |-<br /> ! colspan=2 | Mysql !! colspan=2 | PostgreSQL!! <br /> |-<br /> ! Typ !! Beschreibung !! Typ !! Beschreibung <br /> |-<br /> | tinyint || -128..127 || - || - <br /> |-<br /> | smallint || -32768..+32767 || int2 || -32767 ... +32768 <br /> |-<br /> | int || -2147483648.. +2147483647 || int4 || -2147483648 ... +2147483647 <br /> |-<br /> | || || int8 || +/- 18 Dezimalstellen <br /> |-<br /> | float(n) || n E {4;8}, Einf./doppelte Genauig.|| float4 || 6 Dez.Stellen<br /> |-<br /> | || || float8 || 15 Dezimalstellen <br /> |-<br /> | date || YYYY-MM-DD Datumsformat || date || Datum, Datumformate mit SET DATESTYLE=Value einstellbar <br /> |-<br /> | time || HH-MM-SS Zeitformat || time || Uhrzeit, Auflösung 1 Mikrosekunde <br /> |-<br /> | char(m) || Zeichenkette mit fester Länge || char || ein Zeichen <br /> |-<br /> | varchar(m) || variable Länge, max. m Zeichen || varchar(n) || 4+n Bytes <br /> |-<br /> | blob || Binary Large Object, wird für Texte gebraucht, &quot;TINY&quot;, &quot;&quot;, &quot;LONG&quot; || bytea <br /> |-<br /> | || || money || 4 Byte, -21474836,48 ... +21474836,47 <br /> |-<br /> | || || text || Variable Länge<br /> |-<br /> | || || bool || Kann den Wert 't' oder 'f' annehmen <br /> |}</div> Das-g https://giswiki.hsr.ch/index.php?title=PostgreSQL_for_MySQL_Users&diff=60635 PostgreSQL for MySQL Users 2017-08-29T11:43:35Z <p>Das-g: /* Internet Resources */ wikify links</p> <hr /> <div>Siehe auch:<br /> * [[PostgreSQL]]<br /> <br /> Licensing: <br /> * MySQL: Dual Licensed<br /> * PostgreSQL: BSD-Style<br /> <br /> == Internet Resources ==<br /> <br /> * [https://wiki.postgresql.org/wiki/Things_to_find_out_about_when_moving_from_MySQL_to_PostgreSQL Things to find out about when moving from MySQL to PostgreSQL] (PostgreSQL wiki)<br /> * [https://opslife.org/postgresql-for-mysql-administrators/ PostgreSQL for MySQL Administrators] (opslife blog)<br /> * [http://www.coderholic.com/postgresql-for-mysql-users/ PostgreSQL for MySQL users] (coderholic blog)<br /> * [http://stackoverflow.com/questions/772111/switching-from-mysql-to-postgresql-tips-tricks-and-gotchas Switching from MySQL to PostgreSQL - tips, tricks and gotchas?] on StackOverflow<br /> <br /> == MySQL's &lt;code&gt;INSERT UPDATE&lt;/code&gt; ==<br /> Option 1) Write a function like:<br /> CREATE FUNCTION doinsert(_id integer, _value text) RETURNS void AS $$<br /> BEGIN<br /> UPDATE thetable SET value = _value WHERE id = _id;<br /> IF NOT FOUND THEN<br /> INSERT INTO thetable(id, value) VALUES (_id, _value);<br /> END IF<br /> END;<br /> $$ LANGUAGE plpgsql;<br /> <br /> Option 2) Use two SQL statements:<br /> -- update the existing<br /> UPDATE realTable SET VALUE = (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id)<br /> WHERE EXISTS (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id);<br /> -- insert the missing<br /> INSERT INTO realTable(id, value)<br /> SELECT id, value FROM tmp WHERE NOT EXISTS(SELECT 1 FROM realTable WHERE tmp.id = realTable.id);<br /> <br /> == MySQL's &lt;code&gt;AUTO INCREMENT&lt;/code&gt; ==<br /> * Oracle: &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> * MySQL: &lt;code&gt;id INT UNSIGNED NOT NULL AUTO_INCREMENT&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;id SERIAL&lt;/code&gt; oder &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> <br /> === Syntactic sugar: &lt;code&gt;SERIAL&lt;/code&gt; ===<br /> CREATE TABLE (<br /> Identifier SERIAL;<br /> -- ...<br /> );<br /> <br /> === Explizite Variante: &lt;code&gt;SEQUENCE&lt;/code&gt; ===<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Definition ====<br /> CREATE SEQUENCE myseq;<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Verwendung ====<br /> '''entweder''' als Standard-Wert der Spalte:<br /> CREATE TABLE (<br /> Identifier NUMBER DEFAULT nextval('myseq');<br /> -- ...<br /> );<br /> '''oder''' explizit beim Einfügen neuer Zeilen:<br /> INSERT ... INTO VALUES(nextval('myseq'), 'Name', ...);<br /> <br /> * Siehe auch [http://www.postgresql.org/docs/8.0/static/datatype.html#DATATYPE-SERIAL 1] und [http://www.frankhilliard.com/serialstory.cfm 2]<br /> <br /> == MySQL's &lt;code&gt;DROP TABLE IF EXIST&lt;/code&gt; ==<br /> * Existiert auch in PostgreSQL ab Version 8.2<br /> * Bei früheren Versionen gibt es einen Workaround:<br /> ** % select count(*) from pg_class where relname = 'mytable'<br /> ** return 1 if mytable exists, and 0 if it doesn't<br /> ** so you can run a DROP TABLE command (or not) based on the returned value.<br /> <br /> == MySQL's &lt;code&gt;INT UNSIGNED&lt;/code&gt; (Cardinal) ==<br /> * MySQL: column INT UNSIGNED<br /> * PostgreSQL: column INT CHECK (column &gt; 0)<br /> <br /> == MySQL's Index-Typ ==<br /> * MySQL: INDEX idx_id(id)<br /> * PostgreSQL: CREATE INDEX idx_id ON TABLENAME(id); <br /> <br /> == MySQL's Query Resultset Limit ==<br /> * MySQL: SELECT * FROM tbl LIMIT 10, 5<br /> * PostgreSQL: SELECT * FROM tbl LIMIT 5 OFFSET 10 <br /> <br /> == Data types of MySQL versus PostgreSQL ==<br /> <br /> {| class=&quot;mw-datatable&quot;<br /> |-<br /> ! colspan=2 | Mysql !! colspan=2 | PostgreSQL!! <br /> |-<br /> ! Typ !! Beschreibung !! Typ !! Beschreibung <br /> |-<br /> | tinyint || -128..127 || - || - <br /> |-<br /> | smallint || -32768..+32767 || int2 || -32767 ... +32768 <br /> |-<br /> | int || -2147483648.. +2147483647 || int4 || -2147483648 ... +2147483647 <br /> |-<br /> | || || int8 || +/- 18 Dezimalstellen <br /> |-<br /> | float(n) || n E {4;8}, Einf./doppelte Genauig.|| float4 || 6 Dez.Stellen<br /> |-<br /> | || || float8 || 15 Dezimalstellen <br /> |-<br /> | date || YYYY-MM-DD Datumsformat || date || Datum, Datumformate mit SET DATESTYLE=Value einstellbar <br /> |-<br /> | time || HH-MM-SS Zeitformat || time || Uhrzeit, Auflösung 1 Mikrosekunde <br /> |-<br /> | char(m) || Zeichenkette mit fester Länge || char || ein Zeichen <br /> |-<br /> | varchar(m) || variable Länge, max. m Zeichen || varchar(n) || 4+n Bytes <br /> |-<br /> | blob || Binary Large Object, wird für Texte gebraucht, &quot;TINY&quot;, &quot;&quot;, &quot;LONG&quot; || bytea <br /> |-<br /> | || || money || 4 Byte, -21474836,48 ... +21474836,47 <br /> |-<br /> | || || text || Variable Länge<br /> |-<br /> | || || bool || Kann den Wert 't' oder 'f' annehmen <br /> |}</div> Das-g https://giswiki.hsr.ch/index.php?title=PostgreSQL_for_MySQL_Users&diff=60634 PostgreSQL for MySQL Users 2017-08-29T11:37:43Z <p>Das-g: /* MySQL's AUTO INCREMENT */ unter-unter-Abschnitte</p> <hr /> <div>Siehe auch:<br /> * [[PostgreSQL]]<br /> <br /> Licensing: <br /> * MySQL: Dual Licensed<br /> * PostgreSQL: BSD-Style<br /> <br /> == Internet Resources ==<br /> <br /> * https://wiki.postgresql.org/wiki/Things_to_find_out_about_when_moving_from_MySQL_to_PostgreSQL<br /> * https://opslife.org/postgresql-for-mysql-administrators/<br /> * http://www.coderholic.com/postgresql-for-mysql-users/<br /> * http://stackoverflow.com/questions/772111/switching-from-mysql-to-postgresql-tips-tricks-and-gotchas<br /> <br /> <br /> == MySQL's &lt;code&gt;INSERT UPDATE&lt;/code&gt; ==<br /> Option 1) Write a function like:<br /> CREATE FUNCTION doinsert(_id integer, _value text) RETURNS void AS $$<br /> BEGIN<br /> UPDATE thetable SET value = _value WHERE id = _id;<br /> IF NOT FOUND THEN<br /> INSERT INTO thetable(id, value) VALUES (_id, _value);<br /> END IF<br /> END;<br /> $$ LANGUAGE plpgsql;<br /> <br /> Option 2) Use two SQL statements:<br /> -- update the existing<br /> UPDATE realTable SET VALUE = (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id)<br /> WHERE EXISTS (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id);<br /> -- insert the missing<br /> INSERT INTO realTable(id, value)<br /> SELECT id, value FROM tmp WHERE NOT EXISTS(SELECT 1 FROM realTable WHERE tmp.id = realTable.id);<br /> <br /> == MySQL's &lt;code&gt;AUTO INCREMENT&lt;/code&gt; ==<br /> * Oracle: &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> * MySQL: &lt;code&gt;id INT UNSIGNED NOT NULL AUTO_INCREMENT&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;id SERIAL&lt;/code&gt; oder &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> <br /> === Syntactic sugar: &lt;code&gt;SERIAL&lt;/code&gt; ===<br /> CREATE TABLE (<br /> Identifier SERIAL;<br /> -- ...<br /> );<br /> <br /> === Explizite Variante: &lt;code&gt;SEQUENCE&lt;/code&gt; ===<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Definition ====<br /> CREATE SEQUENCE myseq;<br /> ==== &lt;code&gt;SEQUENCE&lt;/code&gt;-Verwendung ====<br /> '''entweder''' als Standard-Wert der Spalte:<br /> CREATE TABLE (<br /> Identifier NUMBER DEFAULT nextval('myseq');<br /> -- ...<br /> );<br /> '''oder''' explizit beim Einfügen neuer Zeilen:<br /> INSERT ... INTO VALUES(nextval('myseq'), 'Name', ...);<br /> <br /> * Siehe auch [http://www.postgresql.org/docs/8.0/static/datatype.html#DATATYPE-SERIAL 1] und [http://www.frankhilliard.com/serialstory.cfm 2]<br /> <br /> == MySQL's &lt;code&gt;DROP TABLE IF EXIST&lt;/code&gt; ==<br /> * Existiert auch in PostgreSQL ab Version 8.2<br /> * Bei früheren Versionen gibt es einen Workaround:<br /> ** % select count(*) from pg_class where relname = 'mytable'<br /> ** return 1 if mytable exists, and 0 if it doesn't<br /> ** so you can run a DROP TABLE command (or not) based on the returned value.<br /> <br /> == MySQL's &lt;code&gt;INT UNSIGNED&lt;/code&gt; (Cardinal) ==<br /> * MySQL: column INT UNSIGNED<br /> * PostgreSQL: column INT CHECK (column &gt; 0)<br /> <br /> == MySQL's Index-Typ ==<br /> * MySQL: INDEX idx_id(id)<br /> * PostgreSQL: CREATE INDEX idx_id ON TABLENAME(id); <br /> <br /> == MySQL's Query Resultset Limit ==<br /> * MySQL: SELECT * FROM tbl LIMIT 10, 5<br /> * PostgreSQL: SELECT * FROM tbl LIMIT 5 OFFSET 10 <br /> <br /> == Data types of MySQL versus PostgreSQL ==<br /> <br /> {| class=&quot;mw-datatable&quot;<br /> |-<br /> ! colspan=2 | Mysql !! colspan=2 | PostgreSQL!! <br /> |-<br /> ! Typ !! Beschreibung !! Typ !! Beschreibung <br /> |-<br /> | tinyint || -128..127 || - || - <br /> |-<br /> | smallint || -32768..+32767 || int2 || -32767 ... +32768 <br /> |-<br /> | int || -2147483648.. +2147483647 || int4 || -2147483648 ... +2147483647 <br /> |-<br /> | || || int8 || +/- 18 Dezimalstellen <br /> |-<br /> | float(n) || n E {4;8}, Einf./doppelte Genauig.|| float4 || 6 Dez.Stellen<br /> |-<br /> | || || float8 || 15 Dezimalstellen <br /> |-<br /> | date || YYYY-MM-DD Datumsformat || date || Datum, Datumformate mit SET DATESTYLE=Value einstellbar <br /> |-<br /> | time || HH-MM-SS Zeitformat || time || Uhrzeit, Auflösung 1 Mikrosekunde <br /> |-<br /> | char(m) || Zeichenkette mit fester Länge || char || ein Zeichen <br /> |-<br /> | varchar(m) || variable Länge, max. m Zeichen || varchar(n) || 4+n Bytes <br /> |-<br /> | blob || Binary Large Object, wird für Texte gebraucht, &quot;TINY&quot;, &quot;&quot;, &quot;LONG&quot; || bytea <br /> |-<br /> | || || money || 4 Byte, -21474836,48 ... +21474836,47 <br /> |-<br /> | || || text || Variable Länge<br /> |-<br /> | || || bool || Kann den Wert 't' oder 'f' annehmen <br /> |}</div> Das-g https://giswiki.hsr.ch/index.php?title=PostgreSQL_for_MySQL_Users&diff=60633 PostgreSQL for MySQL Users 2017-08-29T11:32:01Z <p>Das-g: mark up SQL keywords &amp; SQL code in section titles</p> <hr /> <div>Siehe auch:<br /> * [[PostgreSQL]]<br /> <br /> Licensing: <br /> * MySQL: Dual Licensed<br /> * PostgreSQL: BSD-Style<br /> <br /> == Internet Resources ==<br /> <br /> * https://wiki.postgresql.org/wiki/Things_to_find_out_about_when_moving_from_MySQL_to_PostgreSQL<br /> * https://opslife.org/postgresql-for-mysql-administrators/<br /> * http://www.coderholic.com/postgresql-for-mysql-users/<br /> * http://stackoverflow.com/questions/772111/switching-from-mysql-to-postgresql-tips-tricks-and-gotchas<br /> <br /> <br /> == MySQL's &lt;code&gt;INSERT UPDATE&lt;/code&gt; ==<br /> Option 1) Write a function like:<br /> CREATE FUNCTION doinsert(_id integer, _value text) RETURNS void AS $$<br /> BEGIN<br /> UPDATE thetable SET value = _value WHERE id = _id;<br /> IF NOT FOUND THEN<br /> INSERT INTO thetable(id, value) VALUES (_id, _value);<br /> END IF<br /> END;<br /> $$ LANGUAGE plpgsql;<br /> <br /> Option 2) Use two SQL statements:<br /> -- update the existing<br /> UPDATE realTable SET VALUE = (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id)<br /> WHERE EXISTS (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id);<br /> -- insert the missing<br /> INSERT INTO realTable(id, value)<br /> SELECT id, value FROM tmp WHERE NOT EXISTS(SELECT 1 FROM realTable WHERE tmp.id = realTable.id);<br /> <br /> == MySQL's &lt;code&gt;AUTO INCREMENT&lt;/code&gt; ==<br /> * Oracle: &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> * MySQL: &lt;code&gt;id INT UNSIGNED NOT NULL AUTO_INCREMENT&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;id SERIAL&lt;/code&gt; oder &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> <br /> === Syntactic sugar: &lt;code&gt;SERIAL&lt;/code&gt; ===<br /> Gebrauch:<br /> CREATE TABLE (<br /> Identifier SERIAL;<br /> -- ...<br /> );<br /> <br /> === Explizite Variante: &lt;code&gt;SEQUENCE&lt;/code&gt; ===<br /> Definition:<br /> CREATE SEQUENCE myseq;<br /> Gebrauch:<br /> '''entweder''' als Standard-Wert der Spalte:<br /> CREATE TABLE (<br /> Identifier NUMBER DEFAULT nextval('myseq');<br /> -- ...<br /> );<br /> '''oder''' explizit beim Einfügen neuer Zeilen:<br /> INSERT ... INTO VALUES(nextval('myseq'), 'Name', ...);<br /> <br /> * Siehe auch [http://www.postgresql.org/docs/8.0/static/datatype.html#DATATYPE-SERIAL 1] und [http://www.frankhilliard.com/serialstory.cfm 2]<br /> <br /> == MySQL's &lt;code&gt;DROP TABLE IF EXIST&lt;/code&gt; ==<br /> * Existiert auch in PostgreSQL ab Version 8.2<br /> * Bei früheren Versionen gibt es einen Workaround:<br /> ** % select count(*) from pg_class where relname = 'mytable'<br /> ** return 1 if mytable exists, and 0 if it doesn't<br /> ** so you can run a DROP TABLE command (or not) based on the returned value.<br /> <br /> == MySQL's &lt;code&gt;INT UNSIGNED&lt;/code&gt; (Cardinal) ==<br /> * MySQL: column INT UNSIGNED<br /> * PostgreSQL: column INT CHECK (column &gt; 0)<br /> <br /> == MySQL's Index-Typ ==<br /> * MySQL: INDEX idx_id(id)<br /> * PostgreSQL: CREATE INDEX idx_id ON TABLENAME(id); <br /> <br /> == MySQL's Query Resultset Limit ==<br /> * MySQL: SELECT * FROM tbl LIMIT 10, 5<br /> * PostgreSQL: SELECT * FROM tbl LIMIT 5 OFFSET 10 <br /> <br /> == Data types of MySQL versus PostgreSQL ==<br /> <br /> {| class=&quot;mw-datatable&quot;<br /> |-<br /> ! colspan=2 | Mysql !! colspan=2 | PostgreSQL!! <br /> |-<br /> ! Typ !! Beschreibung !! Typ !! Beschreibung <br /> |-<br /> | tinyint || -128..127 || - || - <br /> |-<br /> | smallint || -32768..+32767 || int2 || -32767 ... +32768 <br /> |-<br /> | int || -2147483648.. +2147483647 || int4 || -2147483648 ... +2147483647 <br /> |-<br /> | || || int8 || +/- 18 Dezimalstellen <br /> |-<br /> | float(n) || n E {4;8}, Einf./doppelte Genauig.|| float4 || 6 Dez.Stellen<br /> |-<br /> | || || float8 || 15 Dezimalstellen <br /> |-<br /> | date || YYYY-MM-DD Datumsformat || date || Datum, Datumformate mit SET DATESTYLE=Value einstellbar <br /> |-<br /> | time || HH-MM-SS Zeitformat || time || Uhrzeit, Auflösung 1 Mikrosekunde <br /> |-<br /> | char(m) || Zeichenkette mit fester Länge || char || ein Zeichen <br /> |-<br /> | varchar(m) || variable Länge, max. m Zeichen || varchar(n) || 4+n Bytes <br /> |-<br /> | blob || Binary Large Object, wird für Texte gebraucht, &quot;TINY&quot;, &quot;&quot;, &quot;LONG&quot; || bytea <br /> |-<br /> | || || money || 4 Byte, -21474836,48 ... +21474836,47 <br /> |-<br /> | || || text || Variable Länge<br /> |-<br /> | || || bool || Kann den Wert 't' oder 'f' annehmen <br /> |}</div> Das-g https://giswiki.hsr.ch/index.php?title=PostgreSQL_for_MySQL_Users&diff=60632 PostgreSQL for MySQL Users 2017-08-29T11:29:45Z <p>Das-g: /* MySQL's AUTO INCREMENT */ mark up SQL keywords &amp; SQL code in prose</p> <hr /> <div>Siehe auch:<br /> * [[PostgreSQL]]<br /> <br /> Licensing: <br /> * MySQL: Dual Licensed<br /> * PostgreSQL: BSD-Style<br /> <br /> == Internet Resources ==<br /> <br /> * https://wiki.postgresql.org/wiki/Things_to_find_out_about_when_moving_from_MySQL_to_PostgreSQL<br /> * https://opslife.org/postgresql-for-mysql-administrators/<br /> * http://www.coderholic.com/postgresql-for-mysql-users/<br /> * http://stackoverflow.com/questions/772111/switching-from-mysql-to-postgresql-tips-tricks-and-gotchas<br /> <br /> <br /> == MySQL's INSERT UPDATE ==<br /> Option 1) Write a function like:<br /> CREATE FUNCTION doinsert(_id integer, _value text) RETURNS void AS $$<br /> BEGIN<br /> UPDATE thetable SET value = _value WHERE id = _id;<br /> IF NOT FOUND THEN<br /> INSERT INTO thetable(id, value) VALUES (_id, _value);<br /> END IF<br /> END;<br /> $$ LANGUAGE plpgsql;<br /> <br /> Option 2) Use two SQL statements:<br /> -- update the existing<br /> UPDATE realTable SET VALUE = (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id)<br /> WHERE EXISTS (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id);<br /> -- insert the missing<br /> INSERT INTO realTable(id, value)<br /> SELECT id, value FROM tmp WHERE NOT EXISTS(SELECT 1 FROM realTable WHERE tmp.id = realTable.id);<br /> <br /> == MySQL's AUTO INCREMENT ==<br /> * Oracle: &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> * MySQL: &lt;code&gt;id INT UNSIGNED NOT NULL AUTO_INCREMENT&lt;/code&gt;<br /> * PostgreSQL: &lt;code&gt;id SERIAL&lt;/code&gt; oder &lt;code&gt;SEQUENCE&lt;/code&gt;<br /> <br /> === Syntactic sugar: &lt;code&gt;SERIAL&lt;/code&gt; ===<br /> Gebrauch:<br /> CREATE TABLE (<br /> Identifier SERIAL;<br /> -- ...<br /> );<br /> <br /> === Explizite Variante: &lt;code&gt;SEQUENCE&lt;/code&gt; ===<br /> Definition:<br /> CREATE SEQUENCE myseq;<br /> Gebrauch:<br /> '''entweder''' als Standard-Wert der Spalte:<br /> CREATE TABLE (<br /> Identifier NUMBER DEFAULT nextval('myseq');<br /> -- ...<br /> );<br /> '''oder''' explizit beim Einfügen neuer Zeilen:<br /> INSERT ... INTO VALUES(nextval('myseq'), 'Name', ...);<br /> <br /> * Siehe auch [http://www.postgresql.org/docs/8.0/static/datatype.html#DATATYPE-SERIAL 1] und [http://www.frankhilliard.com/serialstory.cfm 2]<br /> <br /> == MySQL's DROP TABLE IF EXIST ==<br /> * Existiert auch in PostgreSQL ab Version 8.2<br /> * Bei früheren Versionen gibt es einen Workaround:<br /> ** % select count(*) from pg_class where relname = 'mytable'<br /> ** return 1 if mytable exists, and 0 if it doesn't<br /> ** so you can run a DROP TABLE command (or not) based on the returned value.<br /> <br /> == MySQL's INT UNSIGNED (Cardinal) ==<br /> * MySQL: column INT UNSIGNED<br /> * PostgreSQL: column INT CHECK (column &gt; 0)<br /> <br /> == MySQL's Index-Typ ==<br /> * MySQL: INDEX idx_id(id)<br /> * PostgreSQL: CREATE INDEX idx_id ON TABLENAME(id); <br /> <br /> == MySQL's Query Resultset Limit ==<br /> * MySQL: SELECT * FROM tbl LIMIT 10, 5<br /> * PostgreSQL: SELECT * FROM tbl LIMIT 5 OFFSET 10 <br /> <br /> == Data types of MySQL versus PostgreSQL ==<br /> <br /> {| class=&quot;mw-datatable&quot;<br /> |-<br /> ! colspan=2 | Mysql !! colspan=2 | PostgreSQL!! <br /> |-<br /> ! Typ !! Beschreibung !! Typ !! Beschreibung <br /> |-<br /> | tinyint || -128..127 || - || - <br /> |-<br /> | smallint || -32768..+32767 || int2 || -32767 ... +32768 <br /> |-<br /> | int || -2147483648.. +2147483647 || int4 || -2147483648 ... +2147483647 <br /> |-<br /> | || || int8 || +/- 18 Dezimalstellen <br /> |-<br /> | float(n) || n E {4;8}, Einf./doppelte Genauig.|| float4 || 6 Dez.Stellen<br /> |-<br /> | || || float8 || 15 Dezimalstellen <br /> |-<br /> | date || YYYY-MM-DD Datumsformat || date || Datum, Datumformate mit SET DATESTYLE=Value einstellbar <br /> |-<br /> | time || HH-MM-SS Zeitformat || time || Uhrzeit, Auflösung 1 Mikrosekunde <br /> |-<br /> | char(m) || Zeichenkette mit fester Länge || char || ein Zeichen <br /> |-<br /> | varchar(m) || variable Länge, max. m Zeichen || varchar(n) || 4+n Bytes <br /> |-<br /> | blob || Binary Large Object, wird für Texte gebraucht, &quot;TINY&quot;, &quot;&quot;, &quot;LONG&quot; || bytea <br /> |-<br /> | || || money || 4 Byte, -21474836,48 ... +21474836,47 <br /> |-<br /> | || || text || Variable Länge<br /> |-<br /> | || || bool || Kann den Wert 't' oder 'f' annehmen <br /> |}</div> Das-g