[Gambas-user] Question
Fabien Bodard
gambas.fr at ...626...
Sun Oct 11 21:44:36 CEST 2015
Here is an example of use with HERE.COM REST API
Private $cInfo As New Collection
Public Sub Form_Open()
Dim hLayer As _MapTile
$cInfo!YOUR_APP_ID = "" '<-- fill it
$cInfo!YOUR_APP_CODE = "" '<--fill it
hLayer = MapView1.Map.AddTile("Here",
"http://{s}.aerial.maps.cit.api.here.com/maptile/2.1/blinetile/newest/satellite.day/{z}/{x}/{y}/256/png8?"
"app_id={YOUR_APP_ID}&app_code={YOUR_APP_CODE}", $cInfo)
hLayer.SubDomains = [1, 2, 3, 4]
hlayer = MapView1.Map.AddTile("Here",
"http://{s}.base.maps.cit.api.here.com/maptile/2.1/streettile/newest/normal.day/{z}/{x}/{y}/256/png8?"
"app_id={YOUR_APP_ID}&app_code={YOUR_APP_CODE}", $cInfo)
hLayer.SubDomains = [1, 2, 3, 4]
MapView1.Map.MaxZoom = 20
End
Just add a MapView to a form :-) and go !
For a google layer :
MapView1.Map.AddTile("GoogleMap",
"https://khms{s}.google.fr/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile",
["version": "138"], "gm").SubDomains = ["0", "1", "2"]
MapView1.Map.AddTile("GoogleRoad",
"https://mts{s}.google.com/vt/lyrs=h at ...3507...&hl=fr&src=app&x={x}&y={y}&z={z}&s=Galile").SubDomains
= ["0", "1"]
For an openstreet layer :
With MapView1.Map.AddTile("OpenStreet",
"http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", Null)
'.Opacity = 0.5
.Copyright = "OpenStreetMap contributors"
.Opacity = 0.5
End With
For a M$ Earth layer :
MapView1.Map.AddTile("Virtual Earth",
"http://ecn.dynamic.t{s}.tiles.virtualearth.net/comp/ch/{q}?mkt=fr-fr&it=G,VE,BX,L,LA&shading=hill&n=z&cb=1").SubDomains
= ["0", "1", "2"]
{x}
is the Column of the tile
{y}
is the row of the tile
{z}
is the zoom level
{q}
is a computed quadkey
{s}
is a subserver list by default ["a","b","c"], it allow gb.map to use
multiple simultaneous call to a range of different server.
You can use a collection to pass some dynamics arguments. The
collection key is given in the pattern between {}.
You can give a cache name so the tiles are saved on your harddrive
and can be used offline.
they are more improvement in gb.map like wms and wmstile support but
it's experimental.
to center your map on a location you can do :
mapview.map.center = mappoint(lat, lon)
be carefull as mappoint is a decimal lat/lon value there is a tool to
convert a given sexagesimal value to a decimal value is the Geo class.
Fortunally Map support shapes too.
I have support for giving a specific pre initialised httpserver on the
need ... it's usefull for server that need authentication before using
with specific cookie file.
This is an hard example of this kind of use.
Public Sub Form_Open()
Dim hClient As New HttpClient
Dim _Lay As _MapTile
Dim cArgs As New Collection
Dim hBounds As New MapBounds
Dim idep, iend As Integer
Dim stext As String
Dim a As String[]
Dim hproj As Proj = Proj("epsg:4326")
hClient.Async = False
hClient.CookiesFile = Temp
hClient.UpdateCookies = True
hClient.URL = "http://www.cadastre.gouv.fr/scpc/rechercherPlan.do"
hClient.Get()
hClient.URL =
"http://www.cadastre.gouv.fr/scpc/listerCommune.do?codeDepartement=017&keepVolatileSession=&listeCommuneNatValeurVueFilterField=&listeCommuneNatValeurVueFilterValue=&offset=500"
hClient.Get()
hClient.URL =
"http://www.cadastre.gouv.fr/scpc/afficherCarteCommune.do?c=9B016&keepVolatileSession"
hClient.Get()
'récupération de la zone
'
sText = Replace(hClient.Peek(), "\t", "")
idep = InStr(sText, "GeoBox(") + 7
iEnd = InStr(sText, ")", idep)
a = Split(Replace(Mid(sText, idep, iend - idep), "\n", ""))
hBounds = Proj("IGNF:RGF93CC46").TransformMBounds(Proj("epsg:4326"),
MapBounds(MapPoint(CFloat(a[1]), CFloat(a[0])), MapPoint(CFloat(a[3]),
CFloat(a[2]))))
MapView1.Map.AddTile("GoogleMap",
"https://khms{s}.google.fr/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile",
["version": "134"]).SubDomains = ["0", "1", "2"]
MapView1.Map.AddShape("mysh")
MapView1.Map!mysh.Addpoint("pp", hBounds.NorthEast)
MapView1.Map!mysh.Addpoint("pp2", hBounds.SouthWest)
MapView1.Map.Zoom = 15
MapView1.Map.Center = hBounds.NorthEast
_Lay = MapView1.Map.AddTile("CAD", "http://www.cadastre.gouv.fr/scpc/wms")
With _Lay
.WMSProjection = "IGNF:RGF93CC46"
.SetCoockieFile(hClient.CookiesFile)
.UseWebMapService = True
.MaxBounds = hBounds
.WMSArgs!version = "1.1"
.WMSArgs!request = "GetMap"
.WMSArgs!layers =
"CDIF:LS3,CDIF:LS2,CDIF:LS1,CDIF:PARCELLE,CDIF:NUMERO,CDIF:PT3,CDIF:PT2,CDIF:PT1,CDIF:LIEUDIT,CDIF:SUBSECTION,CDIF:SECTION,CDIF:COMMUNE"
.WMSArgs!format = "image/png"
.WMSArgs!width = "256"
.WMSArgs!height = "256"
.WMSArgs!exception = "application/vnd.ogc.se_inimage"
.WMSArgs!styles =
"LS3_90,LS2_90,LS1_90,PARCELLE_90,NUMERO_90,PT3_90,PT2_90,PT1_90,LIEUDIT_90,SUBSECTION_90,SECTION_90,COMMUNE_90"
.WMSArgs!bbox = "{lon},{lat2},{lon2},{lat}"
End With
End
As you can see this component is quite complete but can miss many
things. For these missing part i need some users queries as i can't
know all needs.
' Gambas class file
Private $Map As New Map
Public Sub _new()
'LoadFromPac
$Map.AddTile("GoogleMap",
"https://khms{s}.google.fr/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile",
["version": "128"], "gm").SubDomains = ["0", "1", "2"]
$Map.AddTile("GoogleRoad",
"https://mts{s}.google.com/vt/lyrs=h at ...3507...&hl=fr&src=app&x={x}&y={y}&z={z}&s=Galile").SubDomains
= ["0", "1"]
$Map.AddShape("MyShape").Color = Color.green
LoadFromFile($Map!MyShape)
End
Public Sub LoadFromFile(hShape As Object)
'Dim hShape As New Shapes
Dim hmappoints As New MapPoint[][]
Dim hpoints As New MapPoint[]
Dim s, t As String
Dim i As Integer
Dim c As Integer
hshape.Color = Color.Green
s = File.Load("./pointsparcelle")
For Each t In Split(s, "\n")
If t = "" Then
hmappoints.Add(hpoints)
hshape.AddPolygon(i, hmappoints)
'hShape[i].Color = c
'c += 600
Inc i
hmappoints = New MapPoint[][]
hpoints = New MapPoint[]
Else
hpoints.Add(MapPoint(Scan(t, "* *")[1], Scan(t, "* *")[0]))
Endif
Next
'Return hshape
End
Public Sub Form_Open()
Dim i As Integer
For i = 0 To $Map!MyShape.Max
ListView1.Add(i, i, $Map.grab($Map!MyShape[i].Bounds, 120, 100).Picture)
Next
End
This last example show how to load shapes (it's my fields),
initialize a map object and then fill a listView with grabed picture
from the map in a gived Bound limits from the field size.
the map object automatiquely choose the good zoom level to fit the
shape size and the queried image size.
you can provide a padding in pixel too and a fixed zoom level.
Public Function Grab(Bounds As MapBounds, iWidth As Integer, iHeight
As Integer, Optional Padding As Integer, Optional Zoom As Integer) As
Image
Really Gambas is powerfull :-)
More information about the User
mailing list