ThinkGeo.com    |     Documentation    |     Premium Support

Query Throws error

Recently I update the thinkgeo lib to v7.0.0.



But when I try to query some spatial data like


_inMemLayer = MapHelper.GetFeatureLayerFromFile(_fileName);
_inMemLayer.Open();
Collection<Feature> _selectedFeatures = _inMemLayer.QueryTools.GetFeaturesWithin(Shape, ReturningColumnsType.AllColumns);

Parameter Shape is a PolygonShape



eventually it throws error

"

System.NullReferenceException was caught

  HResult=-2147467261

  Message=Object reference not set to an instance of an object.

  Source=MapSuiteCore

  StackTrace:

       at ThinkGeo.MapSuite.Core.PolygonShape.ValidateCore(ShapeValidationMode validationMode)

       at ThinkGeo.MapSuite.Core.BaseShape.Validate(ShapeValidationMode validationMode)

       at oxQ=.Vj0=.nD0=(BaseShape nT0=, String nj0=)

       at ThinkGeo.MapSuite.Core.FeatureSource.SpatialQuery(BaseShape targetShape, QueryType queryType, IEnumerable`1 returningColumnNames)

       at ThinkGeo.MapSuite.Core.FeatureSource.SpatialQuery(BaseShape targetShape, QueryType queryType, ReturningColumnsType returningColumnNamesType)

       at ThinkGeo.MapSuite.Core.QueryTools.GetFeaturesWithin(BaseShape targetShape, ReturningColumnsType returningColumnNamesType)

       at iProTax.Website.Services.SmartMapWcfService.GetFeaturesForZntMigration(String IdPeta, PolygonShape Shape)

  InnerException: 

"



I attach my Tab File as a reference.



Thanks.

Tab_File.zip (180 KB)

Hi Syarief, 
  
 From the exception stack trace, we can see the exception is from the validation on the PolygonShape. So, we suggest you to make sure the “shape” is valid. For example, 
 shape = New RectangleShape(-180,90,180,-90);; 
  
 Or you can send us the PolygonShape’s wkt by “shape.GetWellKnownText();”, so that we can debug the shape to find out why it is not valid. 
  
 Hope it helps. 
 Regards, 
 Johnny

Dear johnny,



Actually I create the polygon shape from the trackshapelayer (get the shape when track_ended) in silverlight client, then I convert it to the PolygonShape class in server service so that I can pass it to the service.



Unfortunately I couldn’t get the shape’s wkt in server side as when I try to get, it throws the same error (Null reference object).



could you please let me know if there is any mistakes/should not do in the conversion step, below is the code.


public static SmartMapServiceReference.PolygonShape ConvertToServiceObject(PolygonShape shape)
        {
            string wkt = shape.GetWellKnownText();
            SmartMapServiceReference.PolygonShape _serviceShape = new SmartMapServiceReference.PolygonShape();
 
            #region create inner rings
            if (shape.InnerRings != null && shape.InnerRings.Count > 0)
            {
                _serviceShape.innerRings = new System.Collections.ObjectModel.ObservableCollection<SmartMapServiceReference.RingShape>();
                foreach (RingShape _innerRing in shape.InnerRings)
                {
                    if (_innerRing.Vertices != null && _innerRing.Vertices.Count > 0)
                    {
                        SmartMapServiceReference.RingShape _inRing = new SmartMapServiceReference.RingShape();
                        _inRing.vertices = new System.Collections.ObjectModel.ObservableCollection<SmartMapServiceReference.Vertex>();
                        foreach (Vertex _innerVertex in _innerRing.Vertices)
                        {
                            SmartMapServiceReference.Vertex _inVertex = new SmartMapServiceReference.Vertex();
                            _inVertex.x = _innerVertex.X;
                            _inVertex.y = _innerVertex.Y;
                            _inRing.vertices.Add(_inVertex);
                        }
                        _serviceShape.innerRings.Add(_inRing);
                    }
                }
            }
            #endregion
 
            #region create outer ring
            if (shape.OuterRing != null)
            {
                _serviceShape.outerRing = new SmartMapServiceReference.RingShape();
                if (shape.OuterRing.Vertices != null && shape.OuterRing.Vertices.Count > 0)
                {
                    _serviceShape.outerRing.vertices = new System.Collections.ObjectModel.ObservableCollection<SmartMapServiceReference.Vertex>();
                    foreach (Vertex _outerVertex in shape.OuterRing.Vertices)
                    {
                        SmartMapServiceReference.Vertex _outVertex = new SmartMapServiceReference.Vertex();
                        _outVertex.x = _outerVertex.X;
                        _outVertex.y = _outerVertex.Y;
                        _serviceShape.outerRing.vertices.Add(_outVertex);
                    }
                }
            }
            #endregion
 
            return _serviceShape;
        }



Thanks.

This is one sample of the shape’s wkt in client side

POLYGON((-233.4375 155.390625,56.25 218.671875,82.96875 73.828125,-260.15625 18.984375,-233.4375 155.390625))

for your ref.



Thanks.

Hi Syaref, 
  
 Sorry for the waiting. 
  
 I checked your method "ConvertToServiceObject" and would you mind to do some explains on "SmartMapServiceReference.PolygonShape"? I guess there are some issues on the "custom" polygonShape. In my opinions, if you want to pass the shape from client to the service, I recommend you just need to pass the "wkt" string to the service and then convert the "wkt" to the PolygonShape type defined in MapSuite. some codes should like this: 
  
 shape = New PolygonShape(WktFromClient);  
 _inMemLayer.QueryTools.GetFeaturesWithin(Shape, ReturningColumnsType.AllColumns); 
  
 Hope it helps. 
 Regards, 
 Johnny 


Dear Johnny,



Sorry for the late response.

I Have solved the problem, actually it is on the Vertex counting.

here


if (_innerRing.Vertices != null && _innerRing.Vertices.Count > 0)

and


if (shape.OuterRing.Vertices != null && shape.OuterRing.Vertices.Count > 0)

even if the vertices wrapper (innerring/outerring) doesn’t have any vertex in it, i must have instantiate the ring.

i just have to remoce count > 0 check.


Hello Syarief, 
  
 Good to hear you have figured out it. 
 If any other questions, don’t hesitate to let us know. 
  
 Regards, 
 Johnny