Nice new forum... I only hope the participation will be high as well...
Searching for some nice GIS integration I am still struggling. I think MapWinGIS is a great open source product but
I am still struggling with an open case (710391) where Powerbuilder(12.5) was just not able to get some values back.
Is nobody else trying to use MapWinGIS Active X?
That is why we still work with TatukGIS, very nice integration into PB but with a very weird licensing policy.
Any other ideas for an open source product, because I really don't like to go for ESRI.
Hi, thanks for taking it up:
It is Powerbuilder 12.5.1 classic, but it is a more principal problem with collections:
Result = ioo_maplayer.SelectShapes( loo_extent, 0, 1, ref ll_index )
// vb example: int shapes = (int)lSelectResults;
We tried with assistance from Sybase every possible way to declare the return values ll_index but whereas you get the proper returns in any c# program, PB will return true for the function, meaning it found a shape but nothing for ll_index.
As far as I understand it is the problem that PB just can't handle collections...
OK ... it took me some time to test the behavior.
Bad news; I do not think PB Classic can/will handle this type of VARIANT.
Eventually some blob hacking will do the job ?!
Good news: MapWinGIS is open source and we are able to include/add some new features.
Actually I have invested some hours to dig into it and I am pretty sure, this can be solved.
Instead of returning a VARIANT (inlcuding an array of long index numbers), returning a string including the index numbers, separated by '~n' will do the job.
Not nice, but a possible working solution.
What's your opinion?
Should I implement this feature?
If 'Yes', consider it done;-)
Tested with PB 10.5.
New function SelectShapesPB:
Result = ioo_maplayer.SelectShapesPB( loo_extent, 1.0, 1, ref ls_selected )
If Result = False Then
Messagebox( "", String( ioo_maplayer.ErrorMsg( ioo_maplayer.LastErrorCode ) ) )
MessageBox("Test", ls_selected )
How to install:
Download the MapWinGIS v4.8 Final Release - 32 Bit (http://mapwingis.codeplex.com/releases)
Download and replace the OCX file in the MapWinGIS progam directory.
Eventually you have to Reregister the ocx via the regMapWinGIS.cmd in the MapWinGIS program directory and to add the control new on your PowerBuilder Window.
I had the problem that the function was still unknown, but I am not sure if these steps are needed.
So please try first without these steps.
Any feedback is welcome.
I am presently busy with some other project, but this looks like a good approach. However, wouldn't it be better to submit these changes to MapWinGIS (so they could implement it as a change to the OCX). I am afraid the function which Arnd fixed is not the only one using a variant for return values.
(I wonder: variant is the recommended way to return values so why is PB having so much problems with this...)
Sure it would make sense to submit these changes.
My intention was that at least one other person accepts/tests those changes before trying to include them into the MapWinGIS OCX general code.
On the other side, it makes sense that SAP Sybase extends the PowerBuilder code....
My testing with the new ocx still shows no results.
Result = ioo_maplayer.SelectShapes( loo_extent, 0, 1, ref ls_selected)
Could we agree on a common shp_file? And on a common setting for the loo_extent?
Presently I just get Result = FALSE and ls_selected is an empty string. If you managed to get a result back I might have to adjust the extent...
Possible common example would be to use from the side: http://www.emapsplus.com/mwh/downloadshape.htm
Good catch... I did a retest and found an error, when only 1 shape is in the result.
You have to download the customized OCX again.
I used different maps from the MapWinGIS Examples. States, Countries etc.
A quick test with the property.shp looks good!!!
Here is some Code, that should help to get the shapes under the pointer.
constant long INTERSECTION = 0
constant long INCLUSION = 1
integer xpos, ypos
xpos = UnitstoPixels( ole_mapwin.PointerX() ,XUnitstoPixels! )
ypos = UnitstoPixels( ole_mapwin.PointerY() ,YUnitstoPixels! )
Double x1, y1, x2, y2, z1, z2, xm, ym, lx , ly , lz
xm = Double( xpos )
ym = Double( ypos )
loo_extent = Create OleObject
ll_rtc = loo_extent.ConnectToNewObject('MapWinGIS.Extents')
/* This is for a region 20 x 20
ole_mapwin.Object.PixelToProj( xm - 10, ym - 10, ref x1, ref y1 )
ole_mapwin.Object.PixelToProj( xm + 10, ym + 10, ref x2, ref y2 )
loo_extent.SetBounds( x1, y1, z1, x2, y2, z2 )
// Get Shape under Pointer
ole_mapwin.Object.PixelToProj( xm , ym, ref lx, ref ly )
loo_extent.SetBounds( lx, ly, lz, lx, ly, lz )
Result = ioo_maplayer.SelectShapesPB( loo_extent, 0, INTERSECTION, ref ls_selected )
If Result = False Then
Messagebox( "FALSE", String( ioo_maplayer.ErrorMsg( ioo_maplayer.LastErrorCode ) ) )
MessageBox("TRUE", ls_selected )