ThinkGeo.com    |     Documentation    |     Premium Support

Render USA and World Map Kit - Can they coexist?

We are currently using MapSuite Desktop Edition 2 with RenderUSA. We extract the Render USA data on a state by state basis, but even then, Texas is about 2GB.


We are attempting to find a migration path to Desktop Edition 3 with World Map Kit.  Aside from the development effort required here, the deployment to our end users becomes an issue due to the size of the map data.  I can't ask remote users on air cards to download and update the map data until they are on a good connection, so I don't want to break them and make map updates optional.


So ultimately my question is: Is there an easy way to get Desktop Edition 3 or the World Map Kit to render from the RenderUSA data?  


If so, this would buy me an easy upgrade path.


If not, then what ideas do you have for an upgrade path here?


Thank you!


Karl Werner



 


Karl,
 
The RenderUSA and World Map Kit almost share the same shape files data, there are some folder structure different, and world map kit add the data for World and Canada. I create guidance about how to upgrade path for RenderUSA and the code for World Map Kit, the procedures are very easy. The only problem I concerned is that the .idx files are different from 2.0 to 3.0, you need to remove all .idx files and copy them from world map kit and paste to the related file path, or you can build new one by using API ShapeFileFeatureLayer.BuildIndexFile(pathFilename);
 
James

1820-UpgradeRenderUSA.doc (170 KB)

Thanks James for the input. I'll take a look at that and see if it leads me to a solution.


The challenge is that I need it to be able to dynamically use either the old RenderUSA data (if installed on a given machine) or the new WorldMap data (if installed on the machine).


Either that, or I have to figure out how to have both my old 2.0 controls in and the new 3.0 controls in our application at the same time and use the apporpriate ones based upon which map data version they have installed . . .  I've run into a bunch of challenges there with Namespace conflicts and such . . .


Any further suggestions?


Karl



Karl, 
  
 I am curious that this dynamically use of the Map Control is being considered in a Development environment machine(with the Map Suite product 2.x or 3.x version product installed) or just a deploy environment machine(without any Map Suite product installed)? 
  
 Thanks 
  
 Yale 


I figured out how to get this to work.


Create a new project, in our case I called it AVLUI30.


Place DesktopEdition dlls in a sub folder under the project and have them build as content and "copy if newer".


Then in the form constructor, code this:



 //The AssemblyResolve event is called when the common language runtime tries to bind to the assembly and fails.
            AppDomain currentDomain = AppDomain.CurrentDomain;
            currentDomain.AssemblyResolve += new ResolveEventHandler(currentDomain_AssemblyResolve);

 We then implement this new event as follows:



Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            //This handler is called only when the common language runtime tries to bind to the assembly and fails.

            //Retrieve the list of referenced assemblies in an array of AssemblyName.
            Assembly MyAssembly, objExecutingAssemblies;
            string strTempAssmbPath = "";

            objExecutingAssemblies = Assembly.GetExecutingAssembly();
            AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies();

            //Loop through the array of referenced assembly names.
            foreach (AssemblyName strAssmbName in arrReferencedAssmbNames)
            {
                //Check for the assembly names that have raised the "AssemblyResolve" event.
                if (strAssmbName.FullName.Substring(0, strAssmbName.FullName.IndexOf(",")) == args.Name.Substring(0, args.Name.IndexOf(",")))
                {
                    //Build the path of the assembly from where it has to be loaded.
                    //The following line is probably the only line of code in this method you may need to modify:
                    strTempAssmbPath = Path.GetDirectoryName(objExecutingAssemblies.Location) + @"\MapSuite30\";
                    if (strTempAssmbPath.EndsWith("\\")) strTempAssmbPath += "\\";
                    strTempAssmbPath += args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll";
                    break;
                }

            }
            //Load the assembly from the specified path.
            MyAssembly = Assembly.LoadFrom(strTempAssmbPath);

            //Return the loaded assembly.
            return MyAssembly;
        }

The assembly initially fails to load, but this gives us an opportunity to load the correct ones.  I can then place code somewhere else in my application and load the appropriate mapping window from the correct project based upon whether they have RenderUSA maps or WorldMapKit installed.  Automagical!



Karl, 
  
 I have tested your solution and it is working, the event occurs when the resolution of MapSuite DLL assembly fails, so I can dynamic get the correct ones.  
  
 You can make your loading code different from 2.x and 3.x by checking the type of assembly, and then you can use the either old data or the new data because you the codes are different. 
  
 Please let me know if you have more questions. 
  
 James