861306c25c92118b25dce4b89cf72e090d1f3b55
[ccsdk/apps.git] / sdnr / wireless-transport / code-Carbon-SR1 / ux / mwtnTopology / mwtnTopology-module / src / main / resources / mwtnTopology / doc / mwtnTopology.fs.md
1 # mwtnTopology - Functional Specification\r
2 \r
3 ## Beschreibung\r
4 \r
5 Das mwtnTopology Control zeichnet eine Karte mit Hilfe eines austauschbaren Kartendienstes\r
6 Dabei wird die Satellitendarstellung verwendet (wenn möglich), sonst wird die Kartendarstellung gewählt.\r
7 Über dem Kartenlayer soll ein Vectorlayer mit Informationen zu Mobilfunkmasten und zugehörigen Richtfunkstrecken dargestellt werden.\r
8 Die Karte soll mittels Mausbedienung Scroll und Zoombar sein, Klicks auf einen Mast oder eine Richtfunkstrecke stellen weitere Informationen in einem Popup zur Verfügung.\r
9 \r
10 ## Anforderungen\r
11 \r
12 * Die Webseite / der Webserver hat *keinen* Zugriff auf das öffentliche Internet. Online-Kartendienste wie Google, Bing oder OpenStreetMap sind damit nicht erreichbar.\r
13 * Der Server stellt eine API bereit, an welcher die Kartenkacheln als Bitmaps (png/jpeg) bereitgestellt werden.\r
14 * Der darzustellende Bereich wird angegeben durch\r
15   - Ein Latitude/Longitude Koordinatenpaar (Mittelpunkt) und eine Zoomstufe in % wobei 0% der "Weltraumansicht" und 100% der "Sandkrümel auf der Straße" entspricht.\r
16     Die benötigten Kacheln werden anhand der Zoomstufe und der Größe des Kartenausschnitts in Bildschirmpixel berechnet.\r
17   - Zwei Latitude/Longitude Koordinatenpaare, welche die obere rechte Ecke und die untere linke Ecke des darzustellenden Kartenausschnitts darstellen.\r
18     Die benötigte Zoomstufe wird anhand der Koordinatenpaare und der Größe des Kartenausschnitts in Bildschirmpixel berechnet.\r
19     + 2 Mögliche SubModi: "Fill" und "Cut"\r
20 * Die Zoomstufen als %-Angaben werden auf die vom Kartenprovider verwendeten ganzzahligen Zoomstufen gemappt.\r
21   - Nicht jeder Kartenprovider kann für alle Zoomstufen Bitmaps liefern. Gibt es eine Möglichkeit die maximale Provider-Zoomstufe für eine Koordinate abzufragen?\r
22 * Der Client cached die Bildkacheln, um die Serverlast zu reduzieren.\r
23   - Localstorage?\r
24 \r
25 ## Offene Fragen\r
26 \r
27 * Soll die Karte immer eingenordet sein oder ist eine Kartenrotation erforderlich?\r
28 * Welche Karten-UI-Steuerelemente müssen angezeigt werden\r
29   - +/- Button / Zoom-Slider\r
30   - 2D-Rotations-Gizmo / Kompass\r
31   - Geokoordinate Zentrieren\r
32   - Kartenscale (20m|---------------|)\r
33   - Copyright-Angaben der verwendeten Kartendaten\r
34   - Ein/Ausblenden des Vector-Overlays\r
35 * Kann ein eigener Tile Render Server (wie z.B. Maperitive) verwendet werden?\r
36 * Transparente, vorberechnete Kacheln des VectorLayers verfügbar? (Kacheln erlauben keine Hover-Informationen einzelner Richtfunktstrecken)\r
37 \r
38 ## Berechnungsformeln\r
39 \r
40 - [OSM: Slippy map tilenames](http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames)\r
41 \r
42 The first part of the URL specifies the tile server, and perhaps other parameters which might influence the style.\r
43 \r
44 Generally several subdomains (server names) are provided to get around browser limitations on the number of simultaneous HTTP connections to each host.\r
45 Browser-based applications can thus request multiple tiles from multiple subdomains faster than from one subdomain.\r
46 For example, OSM, OpenCycleMap and CloudMade servers have three subdomains (a.tile, b.tile, c.tile), MapQuest has four (otile1, otile2, otile3, otile4),\r
47 all pointing to the same CDN. That all comes before the /zoom/x/y.png tail.\r
48 \r
49 Example:\r
50 http://[abc].tile.openstreetmap.org/zoom/x/y.png\r
51 \r
52 ```js\r
53 function long2tile(lon,zoom) { return (Math.floor((lon+180)/360*Math.pow(2,zoom))); }\r
54 function lat2tile(lat,zoom)  { return (Math.floor((1-Math.log(Math.tan(lat*Math.PI/180) + 1/Math.cos(lat*Math.PI/180))/Math.PI)/2 *Math.pow(2,zoom))); }\r
55 \r
56 var zoom        = 9;\r
57 var top_tile    = lat2tile(north_edge, zoom); // eg.lat2tile(34.422, 9);\r
58 var left_tile   = lon2tile(west_edge, zoom);\r
59 var bottom_tile = lat2tile(south_edge, zoom);\r
60 var right_tile  = lon2tile(east_edge, zoom);\r
61 var width       = Math.abs(left_tile - right_tile) + 1;\r
62 var height      = Math.abs(top_tile - bottom_tile) + 1;\r
63 \r
64 // total tiles\r
65 var total_tiles = width * height; // -> eg. 377\r
66 ```\r
67 \r
68 ## Links\r
69 \r
70 - [OpenStreetMap DE:Tile usage policy](http://wiki.openstreetmap.org/wiki/DE:Tile_usage_policy)\r
71 - [OpenStreetMap DE:Karte in Webseite einbinden](http://wiki.openstreetmap.org/wiki/DE:Karte_in_Webseite_einbinden)\r
72 - [OpenStreetMap DE:Maperitive](http://wiki.openstreetmap.org/wiki/DE:Maperitive)\r
73 - [Maperitive, EN:Hauptwebseite](http://maperitive.net/)\r
74 - [Google Maps Javascript API + Key anfordern](https://developers.google.com/maps/documentation/javascript/?hl=de)\r
75 - [Google Maps Javascript Erste Schritte](https://developers.google.com/maps/documentation/javascript/tutorial?hl=de)\r
76 - [Google Developer Console](https://console.developers.google.com/)\r
77 - [GoogleMap AngularJS Directive](https://rawgit.com/allenhwkim/angularjs-google-maps/master/build/docs/index.html)\r
78 - [Sample asnyc script load into head element](http://just-run.it/#/ByvA_ClTe/0)\r