ThinkGeo.com    |     Documentation    |     Premium Support

Spatial Join with Statistics

I am performing a Spatial Join of a Point Layer and a Polygon Layer and would like to generate Statistics for each Polygon, such as Sum, Mean, Average, etc. for each Polygon based upon data fields attached to each Point that falls within a given Polygon.



I see that you have 150 - Spatial Join to handle the Point/Polygon intersections, but no statistics.  I want to perform the same task for Joining of Points/Polygons and 134 - Dissolve with Statistics does for Joined Polygons.



I searched the forum and do no find this topic addressed.



Example use:  Find all customers within a given zip code, then aggregate all those customers sales data into the zip code so that class breaks can be performed on the zip codes by sales totals.



Thanks,



Gregg

Hi Gregg, 
  
 Please let me know whether I misunderstand your scenario. 
  
 1. Your customers sales data are saved in a point shape layer. 
 2. You have a zip code shape file, the zip codes are saved as polygon. 
 2. You want to query the sales in same zip code and show the statistics result. 
  
 If so, you can write code follow this: 
  
 1. Do spatial query between point layer and polygon layer, query all points inside each polygon. 
 2. Do you logic for statistics, and save the result. 
 3. Shows the result. 
  
 As below is a sample code for implement that, wish that’s helpful. 
  
 
 ShapeFileFeatureLayer zipCodesLayer = new ShapeFileFeatureLayer(“PATH”);
            ShapeFileFeatureLayer customersLayer = new ShapeFileFeatureLayer(“PATH”);

            InMemoryFeatureLayer resultLayer = new InMemoryFeatureLayer();

            zipCodesLayer.Open();
            customersLayer.Open();
            resultLayer.Open();

            Collection<Feature> zipCodes = zipCodesLayer.QueryTools.GetAllFeatures(ReturningColumnsType.AllColumns);
            foreach (Feature zipCode in zipCodes)
            {
                PolygonShape zipcodeShape = zipCode.GetShape() as PolygonShape;
                Collection<Feature> customerInZipcode = customersLayer.QueryTools.GetFeaturesWithin(zipcodeShape, ReturningColumnsType.AllColumns);

                // Statistics logic here
                // For example, we have a column named “salesvolume”, and we want to calculate the Sum value here

                double salesVolumeSum = 0;

                foreach (Feature customer in customerInZipcode)
                {
                    salesVolumeSum += double.Parse(customer.ColumnValues[“salesvolume”]);
                }

                // Build new feature in result layer for render
                Feature resultFeature = zipCode.CloneDeep(ReturningColumnsType.AllColumns);
                resultFeature.ColumnValues.Add(“salesvolumesum”, salesVolumeSum.ToString());

                resultLayer.InternalFeatures.Add(resultFeature);
            }

            // Render the result as label
            resultLayer.Columns.Add(new FeatureSourceColumn(“salesvolumesum”));

            resultLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.CreateSimpleTextStyle(“salesvolumesum”, “Arial”, 8, DrawingFontStyles.Regular, GeoColor.StandardColors.Black);
            resultLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
 
 
  
 Regards, 
  
 Don

Don,



Thanks so much for the code that accomplishes both tasks.  I will get with my developer to implement this into our code.



I’ll get back with you if we have any issues getting it up and running.



Sincerely,



Gregg

Hi Gregg, 
  
 Any question please let us know. 
  
 Regards, 
  
 Don