Vector Map Detail adjustment via SDK
Matt_Thales
Global Mapper User
Hi,
The Vector Display tab of the Configuration dialog on Global Mapper application has a slider to control the vector detail shown when the map is drawn. I would like to replicate that effect through the SDK so I can reduce draw times when working with large vector maps.
Is that possible? I haven't found anything in the function reference yet.
Thanks
The Vector Display tab of the Configuration dialog on Global Mapper application has a slider to control the vector detail shown when the map is drawn. I would like to replicate that effect through the SDK so I can reduce draw times when working with large vector maps.
Is that possible? I haven't found anything in the function reference yet.
Thanks
Comments
-
While that is not exposed in the function reference, you can modify it by editing the registry. The value is stored in 'HKEY_CURRENT_USER\Software\Global Mapper\DetailOffset' (note that if you use GM_SetRegistryKey to move the settings location then 'Global Mapper' will be replaced by whatever you used in that call). The value is a DWORD, but should range from -150 (always show everything) to +150 (only show stuff when zoomed way in). The default is -150. Note it is a DWORD value, so negative values will look funny in regedit.
Let me know if I can be of further assistance.
Thanks,
Mike
Global Mapper Support
support@globalmapper.com -
Thanks,
But it seems from my experiments that the registry value is only read at startup. What I really want to be able to do, is adjust the detail as the user zooms in and out. So I need to adjust the detail during runtime.
Is it possible to do that? -
Actually the detail setting is already meant to modify the level of detail displayed as you zoom in and out. Basically each feature type has a zoom level that it should be displayed at or above. The calculated view zoom level is offset by the specified detail level to make those features show up sooner or later than normal. The default value of -150 makes all features show up at all zoom levels. Anything greater than that and you'll have to zoom in further for some feature types (like residential roads) to show up.
Let me know if I can be of further assistance.
Thanks,
Mike
Global Mapper Support
support@globalmapper.com -
OK, now that I know what's going on, it does improve things.
However once I've set the value to a setting where I get all the detail I need at the lower levels it does mean there's still more detail than necessary when zoomed right out.
Thanks. -
If you set the value even higher does it not give you enough at lower levels? The only way to get rid of stuff at higher zoom levels would be to set the detail level even lower. Some types are always displayed regardless of zoom level and detail setting as well.
You could also forgo the built-in detail slider altogether and implement your own zoom-level based filtering however best fits your needs. Use the GM_SetFeatureClassEnabled function to toggle different types on and off.
Thanks,
Mike
Global Mapper Support
support@globalmapper.com -
One relative question (i believe),
is there a way (a drawing flag for example, that i can not find) that forces one point feature not to be displayed because it is located on top of another point feature?
A similar thing is already happening with the labels (you can not find two labels ontop of each other)
Also, is there a way to hide a specific point/area/line and show it later?
Thanks,
Mike. -
Mike,
While there isn't an automatic way to hide a feature because it is under another (it will be obscured just by virtue of something being drawn on top), you can manually turn a feature off by using the GM_DeleteFeature function, then you can call that again to undelete the feature and make it display again.
Let me know if I can be of further assistance.
Thanks,
Mike
Global Mapper Support
support@globalmapper.com -
Hi Mike
Can you expand on the custom zoom-level based filtering mentioned. When using the GM_SetFeatureClassEnabled function to provide a More / Less detail view how do you configure a specific overlay (Map Catalog) for the different (x6 ?) settings. The idea is to provide the operator with a More/Less button to show/hide selected data.
Thanks -
The enabling of different feature classes based on zoom level is a global setting and not something that applies to a particular layer (like a map catalog), although I suppose if you drew each layer separately you could turn different feature types on and off around that draw to make the detail from one particular layer be higher than others.
Thanks,
Mike
Global Mapper Guru
gmsupport@bluemarblegeo.com
http://www.globalmapper.com -
Hi Mike
I've tested the following code to manipulate the Vector Map Detail. The GM_GetFeatureClassInfo causes an "AccessViolationException was unhandled" error.
Any idea what could cause this error. Without the GM_GetFeatureClassInfo I do manage to set using
GM_SetFeatureClassEnabled ... until a gap is reached and a SDK exception is reported.
The Test code:
private void setFeature(byte setvalue)
{
GlobalMapperDLL.GM_FeatureClassInfo_t featureClassInfo = new GlobalMapperDLL.GM_FeatureClassInfo_t();
for (GlobalMapperDLL.GM_FeatureClassType_t8 featureClassType = 0; featureClassType < GlobalMapperDLL.GM_FeatureClassType_t8.GM_FeatureClass_NumTypes; ++featureClassType)
{
UInt16 featureClass = 0;
UInt16 featureClassMax = 0;
bool currEnabled = false;
switch (featureClassType)
{
case GlobalMapperDLL.GM_FeatureClassType_t8.GM_FeatureClass_Area:
featureClass = (ushort)AreaFeatureClass_t16.AFC_MIN;
featureClassMax = (ushort)AreaFeatureClass_t16.AFC_MAX_BUILTIN;
break;
case GlobalMapperDLL.GM_FeatureClassType_t8.GM_FeatureClass_Line:
featureClass = (ushort)LineFeatureClass_t16.LFC_MIN_LINE;
featureClassMax = (ushort)LineFeatureClass_t16.LFC_MAX_LINE;
break;
case GlobalMapperDLL.GM_FeatureClassType_t8.GM_FeatureClass_Point:
featureClass = (ushort)PointFeatureClass_t16.PFC_MIN_POINT;
featureClassMax = (ushort)PointFeatureClass_t16.PFC_MAX_POINT;
break;
default:
continue;
}
for (; featureClass < featureClassMax; ++featureClass)
{
LastGMError = GlobalMapperDLL.GM_GetFeatureClassInfo(featureClass, featureClassType, ref featureClassInfo);
if (LastGMError == GlobalMapperDLL.GM_Error_t32.GM_Error_None)
currEnabled = GlobalMapperDLL.GM_SetFeatureClassEnabled(featureClass, featureClassType, setvalue);
}
}
} -
What do your declarations for the GM_GetFeatureClassInfo, GM_SetFeatureClassEnabled, and GM_FeatureClassInfo_t structures look like? In particular, make sure that you make the 'boolean' type a 'byte', and not a C# 'bool', as the C# 'bool' is a 32-bit value and not 8-bit like the 'boolean' in the C header. Here are declarations that I just added:
// Retrieves information about a given feature class
[DllImport(DLLFileName, EntryPoint = "GM_GetFeatureClassInfo")]
public static extern GM_Error_t32 GM_GetFeatureClassInfo
(
UInt16 aFeatureClass, // IN: Feature class to get info for
GM_FeatureClassType_t8 aFeatureClassType, // IN: Type of feature class (area, point, line)
ref GM_FeatureClassInfo_t aFeatureClassInfo // OUT: Info about the feature class
);
// Enables or disables the display of the given feature class. The previous
// enable/disable state is returned.
[DllImport(DLLFileName, EntryPoint = "GM_SetFeatureClassEnabled")]
public static extern byte GM_SetFeatureClassEnabled
(
UInt16 aFeatureClass, // IN: Feature class to get info for
GM_FeatureClassType_t8 aFeatureClassType, // IN: Type of feature class (area, point, line)
byte aEnable // IN: Enable or disable the feature class
);
Thanks,
Mike
Global Mapper Guru
gmsupport@bluemarblegeo.com
http://www.globalmapper.com -
Hi Mike
My structure declarations are OK. The only discrepancy was my GM_SetFeatureClassEnabled that returned a boolean. Even after fixing that I still get the same "AccessViolationException was unhandled" error. I am using Visual Studio 2008. I can see the return values of GM_GetFeatureClassInfo being correct in Debug mode after the error. Any ideas ?
On a similar topic - what would be an elegant way of manipulating Vector Map Data via the SDK? Reading pre-configured filter files for different display levels that contain the feature types and feature classification status? or is there a standard Global Mapper preset table for the different more/less levels?
Hope you can assist with these... -
I'm investigating. I'm seeing the same thing as you in the sample application. However it works fine in the C++ sample application, so it is something with the call from C#, I'm just not quite sure what yet.
-
I found the problem, the GM_FeatureClassInfo_t structure needs to have the mDesc as an IntPtr not a String because the C# String can't hold a const char* that is returned from the SDK. It can be used to pass one in though. To get the string you would have to do some Marshal stuff to get the string from the pointer..
Thanks,
Mike
Global Mapper Guru
gmsupport@bluemarblegeo.com
http://www.globalmapper.com
Categories
- 12.7K All Categories
- 5.6K Features Discussion
- 342 Downloading Imagery
- 1.3K Elevation Data
- 380 Georeferencing Imagery Discussion
- 628 GM Script Language
- 53 User Scripts
- 113 GPS Features
- 414 Projection Questions
- 819 Raster Data
- 1.3K Vector Data
- 6.6K Support
- 177 Announcement and News
- 908 Bug Report
- 558 SDK
- 1.2K Suggestion Box
- 3.7K Technical Support
- 562 Other Discussion
- 129 GIS Data Sources
- 27 Global Mapper Showcase
- 233 How I use Global Mapper
- 107 Global Mapper Forum Website