ThinkGeo.com    |     Documentation    |     Premium Support

How to add shape files based on user Purpus

 hi,


iam adding shape files by hardcoding like


 



ShapeFileFeatureLayer MumbaiMajorRoadsShapeLayer = new ShapeFileFeatureLayer(@"C:\Program Files\ThinkGeo\Map Suite Web Full Edition 3.0\Samples\CSharp Samples\SampleData\Mumbai-layers\roads.shp");
        ShapeFileFeatureLayer MumbaiWaterShapeLayer = new ShapeFileFeatureLayer(@"C:\Program Files\ThinkGeo\Map Suite Web Full Edition 3.0\Samples\CSharp Samples\SampleData\Mumbai-layers\waterbodies.shp");
        ShapeFileFeatureLayer MumbaiAdminShapeLayer = new ShapeFileFeatureLayer(@"C:\Program Files\ThinkGeo\Map Suite Web Full Edition 3.0\Samples\CSharp Samples\SampleData\Mumbai-layers\administrative.shp");
        ShapeFileFeatureLayer indiaDistrictsLayer = new ShapeFileFeatureLayer(@"C:\Program Files\ThinkGeo\Map Suite Web Full Edition 3.0\Samples\CSharp Samples\SampleData\India\districts.shp");

but now i want to add shape files beased on user intrest.like every user have his own shape layers.based on that user i need to show shape files in map.

for ex:USER1 have shapefiles like mumbai
USER2 have shapefiles like Banglore
USER3 have shapefiles lioke Hyderabad

so based on user i need to shoe shape files in map.how to maintain all this shape files.From database can we maintain this shape file.means first user upload this shapefiles in the form of Rar file in database.like this is it possible. 


 



Hi Raj, 
  
 Could you please describe your scenario to me? Why do you need hardcoding, I think the user could add their own shape files right? 
  
 Thanks, 
 Edgar

 means actually my web application is multi company application.means every company is having their own shape files.


 


for suppose company1 is having shape files like ROADS,WATER,PLACES


Company 2 is having shape files like Powe lines,railways,cities


company 3 is having like admin areas,districts,small roads.


 


first iam adding my shape files in my appliaction map folder.from that map folder iam accesing this shape files.so if i add a new company means they have their own layers.so how to acess this layers.so if i want to aceess this layers menas again i need to add this layers in ma[p folder.so i dont want like that.can we maintain these shape files in database.and from database can we access this shape files.



Well, in this way a better solution is to import these shape files to SqlServer, and use MSSql2008FeatureLayer to access the features. And if you add a new company, just create the table for the shape files. 
  
 Regards, 
 Edgar

 Thank you,


can you provide one example how to work with mssql2008Featurelayer.please provide one sample example for working with mssql2008Featurelayer.


and what are the file we need to upload in database like we have different files like(shp,dbf,shx,cpg,ids,idx) files.from this which files we need to upload in sqlserver.



Hi rajanikanth,


A sample demonstrating the use of a MSSQL2008FeatureLayer can be found in the Desktop Edition Sample applications installed with the Map Suite Desktop Evaluation Edition. Look in the Data Providers section for the LoadMsSql2008FeatureLayer sample.


For information on uploading shapefiles to SQL server check out: sharpgis.net/page/sql-se...tools.aspx



 iam adding my shape file in my database through your link.when i call that shape files it is showing error like 


"an object or column name is missing or empty.for select into statements.verify each column has a name.alias defines as "" or []are not allowed.change alias to a valid name


iam writing code like this



            Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));


            Map1.CurrentExtent = new RectangleShape(-140, 60, 140, -60);


            Map1.MapUnit = GeographyUnit.DecimalDegree;


          Map1.StaticOverlay.ClientCache.CacheId = "WorldOverlay";


            Map1.StaticOverlay.ServerCache.CacheDirectory = MapPath("~/ImageCache/" + Request.Path);  


          string connectString = "User ID=sa;Password=sa!2011;Data Source=SQLSERVER\\SQL2008;";


            MsSql2008FeatureLayer sql2008Layer = new MsSql2008FeatureLayer(connectString, "majtrans2001", "ID");


            sql2008Layer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.MajorRoad1;


            sql2008Layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


            Map1.StaticOverlay.Layers.Add("Sql2008Layer", sql2008Layer); 



 



 now iam giving    sql2008Layer.Srid = 4326 now the map is showing and it displays new error like\


"a .net frame work error occured during execution of user-defined toutinegeography.


system.format exception : lateitude values must be between -90 and 90 degrees.like thgis it is showing.


and if iuse Map1.CurrentExtent = sql2008Layer.GetBoundingBox();


it si showing error like 


 


"A .NET Framework error occurred during execution of user-defined routine or aggregate "geometry": 


System.ArgumentException: 24144: This operation cannot be completed because the instance is not valid. Use MakeValid to convert the instance to a valid instance. Note that MakeValid may cause the points of a geometry instance to shift slightly."


 


iam getting these errors.


 


please give me solution for this problems



rajanikanth,  
  
 It would seem that you have invalid geometry in your shapefiles and when you uploaded this into SQL Server these invalid features were included. To resolve this issue you need to make sure your shapefile contains valid features before importing those features into SQL server. Although I would advise you to go back to the original data provided to get a new source shapefile containing only valid features, SQL Server does have MakeValid commands that you find by searching Google.

 i downloaded the shape files from open street map layer alabama state.even iam using sample data states shape file at this time also iam getting thi same error.i think open street map shape files contains all valid data only.but still iam facing problem


 


and iam using getboundindex() method to get the shape .here also iam getting error.how to solve this one.


error is "A .NET Framework error occurred during execution of user-defined routine or aggregate "geometry": 


System.ArgumentException: 24144: This operation cannot be completed because the instance is not valid. Use MakeValid to convert the instance to a valid instance. Note that MakeValid may cause the points of a geometry instance to shift slightly."


 


my code is like this


 


  Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));


                Map1.CurrentExtent = new RectangleShape(-131.22, 55.05, -54.03, 16.91);


                Map1.MapUnit = GeographyUnit.DecimalDegree;


 


 string connectString = "Data Source=SQLSERVER\\SQL2008;Initial Catalog=BMSIWO_BMSImap;User ID=sa;Password=sa!2011";


          


            MsSql2008FeatureLayer sql2008Layer = new MsSql2008FeatureLayer(connectString, "adminareas", "ID");


            sql2008Layer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle= AreaStyles.Country1;


            sql2008Layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


            sql2008Layer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.Country1("name");


                


            Map1.StaticOverlay.Layers.Add("Sql2008Layer",sql2008Layer);


            sql2008Layer.Srid = 4326;


            sql2008Layer.Open();


           Collection<feature> features = sql2008Layer.QueryTools.GetAllFeatures(ReturningColumnsType.AllColumns);</feature>


           int count = sql2008Layer.FeatureSource.GetCount();


          Map1.CurrentExtent = sql2008Layer.GetBoundingBox();//Here iam getting error


 


 


       sql2008Layer.Close();


  i think msssql2008feature layer supports both windows and web application right.iam using mapsuite for web edition.is there any code problem here.



HI Raj,


I think the OpenStreetMap data has problem, you can use this code to check,



SHapeFileFeatureLayer layer = new ShapeFileFeatureLayer("shapeFile"); 
layer.Open();  
foreach(var item in layer.QueryTools.GetAllFeatures(ReturningColumnsType.NoColumns)) 
{
     if(!item.IsValid())
     {
         throw new Exception("ex");
     }
}

 


Please make sure you are using the Development Build after 6.0.37.0 as we used a new engine in our topology rules.


Regards,


Edgar



No It does not throw any exception. 


i think msssql2008feature layer supports both map suite desktop and web edition right.iam using mapsuite for web edition.is there any code problem here.


iam using mapsuite web edition 6.0 version.the dll is showing details a version of 6.0.0.0.how can i get 6.0.37.0 build verson


 


i download WebEditionEvaluation6.0.186.0DllPackage from evaluation daily builds.if i try to add web edition.dll,mapsuitecore.dll from Managed Assemblies or Managed Assemblies-strong nmae.it is not adding.what is the problem here..



Hi rajanikanth,


There are a couple of problems I encountered with your application you provided in the ticket. 


First you provided a Visual Studio 2008 solution. It is okay that you are using VS 2008 but VS 2008 cannot compile against the .NET 4.0 Framework, it can only compile against the .NET 3.5 Framework.


The tools that we use to conduct the IsValid() method checking on your features (Microsoft.SqlServer.Types) are only available from the 6.0.36.0 Development Daily Build version and newer and all of the Map Suite dlls from 6.0.36.0 and newer are only compiled for .NET 4.0.


Thus you cannot use the IsValid() method calls within VS2008 as you cannot reference the 6.0.36.0 or newer dlls which can only work in a .NET 4.0 application. Check out this link where we discuss the introduction of the SQLServerTypes for the 6.0.36.0 versions: gis.thinkgeo.com/Support/Dis...x#geometry


I created a VS2010 - .NET 4.0 application and was able to validate all of the features that exist in your shapefile. So the features in your shapefile are valid. There must be some problem with your conversion from Shapefile to SQL that is causing the issue. Unfortunately as we did not create the ShpToSQL tool I cannot assist you with the conversion process. 


One idea is to perhaps double check which Data Type you chose during your converstion process: Geometry or Geography.


The Geometry Data Type does does not require that the 'ring-shapes' for your areas follow a specific pattern, the Geography Data Type does require that the ring shapes be in a certain order. It would seem from the exceptions you are receiving that the DataType could be the issue. For more information on this please check out: gis.thinkgeo.com/Support/Dis...fault.aspx

 



hello Ryan,


Iam using geography only for converson.and check check boxes for Set srid.thats only iam doing.then what is the problem.iam not getting any solution for this one.my application is used for multi company so i must and should use only mssql2008feature layer.so please let me know whether we can use this mssql2008feture layer for vs2008 or not.


 


 



Hi Raj, 
  
 Can you use geometry instead of geography? Because geography type is more strict than geometry and if a polygon is larger than a hemisphere, it will be invalid. I think the invalid features in the SQL Server are caused by this reason. Besides, we highly recommend you to use VS2010 cause we will upgrade all of our products to .Net 4.0 in next release, as vs2008 cannot compile against .Net 4.0, you may not be able to use our products after next release. 
  
 Regards, 
 Edgar