Scaled Maps

klaus

Expert
Licensed User
Longtime User
Here is an application for displaying scaled maps.

The project began already in this thread http://www.b4x.com/forum/chit-chat/3553-mapping.html#post20687 , but ceasar and myself find that it's right place is here.

What can be done:
- Different maps can be loaded.
- The maps can be scaled, and the scaling saved (two points only yet).
- Drawings can be made onto the maps on 3 different layers:
- polylines with different colors, line widths
- circles with radius in meters, different colors, line widths, filled or empty
- texts with different colors, font sizes, font styles, with or without background color
- bitmaps, with or without background color, 4 bitmaps are predefined, these can be deleted and others loaded.
- Select any element of the drawing and modify, or delete it. To change the position of an element, click on it, move it and release, or change the coordinates.
- New points can be added to polylines.
- Save and load drawings. The saved data is just the geometry of the drawing elements, with a reference to the map. To load drawings, the program shows only those belonging to the map.
- Calculate the length of a polyline
- 2 maps of Cape Town are included, one with a km scaling and the other one with long, lat in degrees, sources Google Maps and Google Earth.

What can not be done yet:
- Scaling with 3 points
- Undo and redo

What is still missing:
- no GPS support

The help file is here.
www.b4x.com/files/ScaledMapHelpE.zip
It contains the help file itself and the map I used to create this help file.

I would be pleased to have some feedback of what is missing, improvement suggestions and bug reports.

Best regards.

EDIT: 2009.11.21
Version 2.0 bug renoval and some minor changes.

EDIT: 2011.02.27
Version 3.0 with a beginning of GPS support not really tested.
Leave it as it is.
 

Attachments

  • ScaledMap.jpg
    ScaledMap.jpg
    32.9 KB · Views: 563
  • ScaledMap3_0.zip
    352.8 KB · Views: 472
Last edited:

ceaser

Active Member
Licensed User
Hi Klaus

Thanks for your effort and input. :sign0188: To be honest with you, I did not get a chance to play with it yet. I am trying very hard to get the Surveying program that I had running on the Workabout (from Psion) to run on a Windows Mobile device. I am nearly finished, but there are still some hicups that I need to sort out. Every surveyor that is using the old program is breathing down my neck to test out the new program.

At the moment I am sitting here with 7 different surveying instruments that I need to interface and the approach is a bit different than in "OPL" or NSBasic.
(I wasted my time with NSBasic!:sign0148:)

This should take about another week, then I will work through your Mapping program and give you some feedback.

Klaus, once again I say thank you very much for your help.:sign0188:

Regards
Michael
 

klaus

Expert
Licensed User
Longtime User
Hi Michael,

Don't worry, I saw with your other posts that you were quite busy with other problems. I did interface measurement instruments and a computer with serial port years ago in VB, but don't remember all details.

There is now a help file in the first post.

Best regards.
 

Ariel_Z

Active Member
Licensed User
It's an amazing program, but there's a bug in it: If you zoom in to the maximun, scroll to the right-bottom corner, and then zoom out, there is a strech of the image. Then, when zooming in, an error ocurred in line 578 in module Map.bas.
 

wm.chatman

Well-Known Member
Licensed User
Longtime User
:) Hi Klaus

it would be very cool to get the Scaling3points and GPS support in Version Scaled Map 2.0 to work. that would really be great, and a killer source, to learn from! :sign0060:

Best regards
William
 

klaus

Expert
Licensed User
Longtime User
Hi William,

I don't plan it in a short time.
If there is any interest from other users I could consider it.
Probably not the GPS support because I am writing another GPS program.

But feel free to take it and add your own code.

Best regards.
 

SarahWard

Banned
Hi Klaus

I have been looking at your program scaled map with the idea of adding the gps part to it.

Did you ever work out the code for converting a lat/long coord set to your program's map-scale coordinate?

If I could convert a lat / long (or utm) coordinate set to your scaled map coordinate system I could add the gps functionality.

Sarah
 

wm.chatman

Well-Known Member
Licensed User
Longtime User
:) Hi Sarah Ward

Thats sounds fantastic!

PS. i am able to set a pizel on the Map, and thats all yet. Ha, ha.

I am a bit slow with Variables and constants, and a few other.

Best regards

William
 
Last edited:

klaus

Expert
Licensed User
Longtime User
Hi SarahWard,

In the 'ScaledMaps' program there is no dedicated unit system.
It's up to the user to select the right coordintate units and to enter the correct values for the upper left and lower right corner or reference lines.

When you scale a map you can select the unit type.
Selecting 'degrees' can mean UMT units.
Setting the UMT values for the upper left and lower right corner your map is scaled in UMT units.
If you look at the 'ShowScaledMap' program in the Graphics Tutorial it's an example of a same map image with 2 different scales. The scales are defined by the coordinate values of the upper left and lower right corner.

The 'ScaledMaps' program assumes that your map image is oriented north-south. It's intended for relative small maps, there is no calculation of the longitude difference in the upper and lower border.

Best regards.
 

SarahWard

Banned
Hi William

You say you are able to set a pixel. Do you mean literally setting an x/y coord pixel, or have you been able to set a gps coord on the scaled map as a pixel?
 

wm.chatman

Well-Known Member
Licensed User
Longtime User
:) Hi Sarah Ward

sad reply...

meaning literally I can set an x/y pixel on Form or Image. Still working on setting a gps coord on the map as a pixel itself. Setting gps coord is still out of bounce.

Best regards and Merry Xmas / Happy New Year.

William
 
Last edited:

derez

Expert
Licensed User
Longtime User
You want it like this image ? The red dashed line is the result of a GPS recording, driving on a new road which is not marked yet on the map.
 
Last edited:

SarahWard

Banned
You want it like this image ? The red dashed line is the result of a GPS recording, driving on a new road which is not marked yet on the map.

Absolutely David

I need the code that takes the lat/long coord and makes it a map plottable x/y coord on the scaledmap display. If you have achieved that then I would be most grateful for the alghorthymn that does the coverting part. I would like to add a front end to Klaus's excellent mapscale software.

Sarah
 

derez

Expert
Licensed User
Longtime User
Sarah
Here it is. Explanations in the code.

B4X:
tempx = point(0).geo_long ' this holds the longitude of present position
tempy = point(0).geo_lat   ' and this - the latitiude
 
left = (tempx - x1 )* mapwidth /(x2-x1) - center_x/zoom 
top  = (tempy - y1 )* mapheight/(y2-y1) - center_y/zoom 

' (x1,y1) and (x2,y2) are the coordinates of the corners of the map used.
'mapwidth is the map width in pixels.
' center_x and center_y are  175 - the middle of the clipboard image.
' zoom is 1 for original size, 1.25 means 125% zoom in, 0.8 means 125% zoom-out etc.

IWZ = IW/zoom  ' IW = 350, its a clipboard image size
IHZ = IH/zoom    ' IH = 350

bmx.New1(AppPath & "\images\350.jpg") ' clears previous map from bmx, the picture is a blank one. bmx is a bitmapEx object.
drawer.New2(bmx.Value)          ' re-declare the drawer to the new image, drawer is a drawerEx object.

If left < 0 Then
   mw = IWZ + left 
   destx = - left*zoom
   startx = 0
Else 
   mw = Min(mapwidth - left, iwz)
   destx = 0
   startx = left
End If
If top < 0 Then
   mh = IHZ + top
   desty = -top*zoom
   starty = 0
Else
   mh = Min(mapheight - top,ihz)
   desty = 0
   starty = top
End If

If mw >= 1 AND mh >= 1 Then 
   tmap1.New2(mw,mh)  ' tmap is a bitmapEx object
   tmap1.Value = jpeg.LoadArea(mapname,startx,starty,mw,mh)
   mapdst.New1(destx,desty,tmap1.Width*zoom,tmap1.Height*zoom) ' mapdst and mapsrc are rectangleEx objects.
   mapsrc.New1(0,0,tmap1.Width,tmap1.Height)
   drawer.DrawImage(tmap1.Value,mapsrc.Value,mapdst.Value,False)


            src.New1(55,40,240,268)  ' size of a form, from the center of bmx
            dst.new1(0,0,240,268) ' a form size
            drx.DrawImage(bmx.Value,src.Value,dst.Value,False) ' drx is a drawerEx object which draws on the form.
End If

notes:
1. the code is taken from few subs, some lines need to be done only once,others for every new position.
2. The use of a clipboard with size of 350x350 is to enable rotation of the map before copying to the form, without loosing the corners. Rotation is not in the code above.
3. The map drawn on the form is a moving map, the present position is the center of the form (draw a circle or something there on the forelayer).

I hope I forgot no crucial elements. Try to play with it, and when you're ready I'll show you the path drawing part as well.
 
Last edited:

wm.chatman

Well-Known Member
Licensed User
Longtime User
:) thanks for sharing!

derez, your great.

BTW: Klaus has a Draw Circle function already coded, can this be used?

Best regards.

William
 

derez

Expert
Licensed User
Longtime User
William
You don't need that one, just (from the help):

Form1.ForeLayer = True
Form1.FCircle (100, 120, 40, cYellow) ' Empty yellow circle

or

Form1.FCircle (200, 30, 10, 0, 255, 0, F) ' Filled green circle

or

Form1.FCircle (150,150, 30, Button1.Color) ' Empty circle with the color of Button1
 

wm.chatman

Well-Known Member
Licensed User
Longtime User
as always, I just try the wrong things... :(
place code into frmMain, right!?

BTW: the code you posted #17, where do I need to place? :confused: frmMainLoad?

Best regards.

Limited Knowledge
 
Last edited:
Top