CreateCustomVectorLayer problem
Hi,
I've a problem with the CreateCustomVectorLayer function.
I have a collection of maps in my application, which I load from shape-files from the harddrive. But I also would like to create a new layer to show event locations on it with a button click.
When I add the points to an open layer the points are visible, but when I try to create a new layer and show the points on it I get nothing at all...
Creating the layer by calling the dll's function gives back the new id of the layer, but I cannot make it visible.
I quote a simplified part of my function, maybe it helps to solve my problem.
Thanks in advance!
Zsolt
IntPtr layerid;
GM_Projection_t testProjLay = new GM_Projection_t();
GlobalMapperDLL.GM_GetProjection(testProjLay);
layerid = GlobalMapperDLL.GM_CreateCustomVectorLayer(null, ref testProjLay);
GM_PointFeature_t testpoint = new GM_PointFeature_t();
testpoint.mPointStyle.mSymbolName = "DOT_CUSTOM_5_255_0_0";
testpoint.mPos.mX = 681476;
testpoint.mPos.mY = 200000;
GlobalMapperDLL.GM_AddPointToVectorLayer(layerid, ref testpoint, 0);
GlobalMapperDLL.GM_SetLayerEnabled(layerid, true);
DrawLayersToBitmap();
I've a problem with the CreateCustomVectorLayer function.
I have a collection of maps in my application, which I load from shape-files from the harddrive. But I also would like to create a new layer to show event locations on it with a button click.
When I add the points to an open layer the points are visible, but when I try to create a new layer and show the points on it I get nothing at all...
Creating the layer by calling the dll's function gives back the new id of the layer, but I cannot make it visible.
I quote a simplified part of my function, maybe it helps to solve my problem.
Thanks in advance!
Zsolt
IntPtr layerid;
GM_Projection_t testProjLay = new GM_Projection_t();
GlobalMapperDLL.GM_GetProjection(testProjLay);
layerid = GlobalMapperDLL.GM_CreateCustomVectorLayer(null, ref testProjLay);
GM_PointFeature_t testpoint = new GM_PointFeature_t();
testpoint.mPointStyle.mSymbolName = "DOT_CUSTOM_5_255_0_0";
testpoint.mPos.mX = 681476;
testpoint.mPos.mY = 200000;
GlobalMapperDLL.GM_AddPointToVectorLayer(layerid, ref testpoint, 0);
GlobalMapperDLL.GM_SetLayerEnabled(layerid, true);
DrawLayersToBitmap();
Comments
-
My first guess is that the projection that you are using for the layer and the XY coordinates for your point don't make sense together. What is your projection set to (i.e. what does GM_GetProjection return) and what projection are your XY values in?
Thanks,
Mike
Global Mapper Support
support@globalmapper.com -
Ok, I'm absolutely not fully aware of the usage and meaning of "Projection".
I suppose a projection is created automatically when I first initialize the map?
I tried to get the parameters of it, but I don't know how?
I also tried to create a new vector layer with the above quoted code. I supposed that the point belonged to the new projection, because I made a connection between them with this:
GM_AddPointToVectorLayer(layerid, ref testpoint, 0);
where
layerid = GlobalMapperDLL.GM_CreateCustomVectorLayer(null, ref testProjLay);
I'm totally lost somewhere... could you help me to find the right way?
Is the usage and the main principles of that documented somewhere?
Thanks,
Zsolt
P.S.: by calling this:
LastGMError = GlobalMapperDLLWrapper.GlobalMapperDLL.GM_GetProjection(testProjLayer);
I get the "InvalidParam" as return value.... -
Zsolt,
The projection defines what coordinate system your XY coordinates are in. For example you may have latitude and longitude coordinates in degrees referenced to the WGS84 datum (the most common one used worldwide). For that you would setup your projection as follows:
GM_Projection_t theProj;
theProj.mProjSys = GM_PRJ_GEO;
theProj.mDatum= GM_DATUM_WGS_84;
theProj.mUnit = GM_PRJ_UNIT_ARC_DEGREES;
theProj.mNumAttrs = 0;
If your XY coordinates are in some projected system, like UTM, then you would need to setup your projection to reflect that. For example, here is a definition of a UTM zone 15 projection in meters with the NAD83 datum:
GM_Projection_t theProj;
theProj.mProjSys = GM_PRJ_UTM;
theProj.mDatum= GM_DATUM_NAD83;
theProj.mUnit = GM_PRJ_UNIT_METERS;
theProj.mNumAttrs = 1;
theProj.mAttrList[0].mAttr = ZONE;
theProj.mAttrList[1].mValue = 15.0;
Let me know if I can be of further assistance.
Thanks,
Mike
Global Mapper Support
support@globalmapper.com -
Hello Mike,
finally I've succeeded in getting the CustomLayer work.
I made two mistakes; one of them is that I tried to give "DATUM.GM_DATUM_DEFAULT" value to mDatum, but with this I got the "Attempted to read or write protected memory" error. So I simply omited setting this parameter.
The other was that I didn't fill any of the mAttr values, because I have no idea what are these and what kind of values can be there..??
I feel that without your exact example I wouldn't have been able to create a new custom layer..:// Where the other programmers get all these information?
Thanks,
Zsolt -
Zsolt,
When working with your own coordinates you have to know what coordinate system (i.e. projection, datum, and units) those coordinates are in for them to make sense. This involves dipping your toe into the complex world of map projections and datums.
I would suggest checking out some online resources like http://www.maptools.com/UsingUTM/mapdatum.html (for datums) and http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html (for projections) to get an idea of at least what they are.
You really should fill your datum parameter in, otherwise you will get the datum associated with index 0, which is I believe Adindan which is only used for parts of Africa (if I remember correctly). More than likely the correct datum for you is GM_DATUM_WGS_84. This is the datum used by GPS systems and is the most widely used datums. Using the wrong datum can result in position errors of up to a few hundred meters.
If you can provide some of the sample XY coordinates that you are using and what the source of those coordinates are I can provide a likely guess of what projection you should use for them.
Thanks,
Mike
Global Mapper Support
support@globalmapper.com -
Hello Mike,
I thought that when a map is opened, the system stores the relevant projection data so I didn't have to set it again. But ok, I was wrong.
I know that our maps use UTM and NAD83, so from your quoted sample I was able to ctreate a working layer, as I mentioned earlier. So now everything is ok.
And thanks for the links, I'll have a closer look at those! Unfortunately I don't have a big past in spatial programming..:)
Thank you very much for your help again,
Zsolt
Categories
- 12.9K All Categories
- 5.7K Features Discussion
- 346 Downloading Imagery
- 1.3K Elevation Data
- 385 Georeferencing Imagery Discussion
- 645 GM Script Language
- 54 User Scripts
- 115 GPS Features
- 419 Projection Questions
- 829 Raster Data
- 1.4K Vector Data
- 6.6K Support
- 180 Announcement and News
- 926 Bug Report
- 561 SDK
- 1.2K Suggestion Box
- 3.7K Technical Support
- 575 Other Discussion
- 132 GIS Data Sources
- 27 Global Mapper Showcase
- 242 How I use Global Mapper
- 108 Global Mapper Forum Website