[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