# Union Two Features

**URL:** <https://community.thinkgeo.com/t/union-two-features/6082>\
**Category:** WebForms\
**Created:** [January 2, 2012, 2:18pm UTC](https://community.thinkgeo.com/t/union-two-features/6082 "2012-01-02T14:18:58Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![shwe](https://community.thinkgeo.com/letter_avatar_proxy/v4/letter/s/ed8c4c/32.png) [@shwe](https://community.thinkgeo.com/u/shwe)\
**Post date:** [January 2, 2012, 2:18pm UTC](https://community.thinkgeo.com/t/union-two-features/6082/1 "2012-01-02T14:18:58Z")

</div>

Hello,

&nbsp;I&nbsp;have&nbsp;zip&nbsp;codes&nbsp;in&nbsp;my&nbsp;SalesArea&nbsp;and&nbsp;I&nbsp;need&nbsp;to&nbsp;merge(union)&nbsp;the&nbsp;zips&nbsp;codes&nbsp;of&nbsp;a&nbsp;SalesArea&nbsp;at&nbsp;the&nbsp;time&nbsp;displaying&nbsp;so&nbsp;that&nbsp;it&nbsp;will&nbsp;have&nbsp;only&nbsp;one&nbsp;boundry&nbsp;line.

&nbsp;I&nbsp;create&nbsp;SalesArea&nbsp;in&nbsp;"InMemoryFeatureLayer"&nbsp;and&nbsp;display&nbsp;them.

&nbsp;Union&nbsp;of&nbsp;features&nbsp;works&nbsp;as&nbsp;in&nbsp;the&nbsp;sample&nbsp;code.&nbsp;I&nbsp;also&nbsp;have&nbsp;developed&nbsp;using&nbsp;provided&nbsp;sampe&nbsp;code&nbsp;in&nbsp;my&nbsp;project&nbsp;and&nbsp;it&nbsp;works.&nbsp;But&nbsp;developing&nbsp;almost&nbsp;exactly&nbsp;the&nbsp;same&nbsp;to&nbsp;merge(union)&nbsp;for&nbsp;my&nbsp;own&nbsp;zip&nbsp;codes&nbsp;does&nbsp;not&nbsp;work.

e.g.&nbsp;this&nbsp;is&nbsp;from&nbsp;sample&nbsp;code&nbsp;that&nbsp;i&nbsp;tried&nbsp;in&nbsp;my&nbsp;project&nbsp;and&nbsp;it&nbsp;works.

`AreaBaseShape targetShape = (AreaBaseShape)saLayer.InternalFeatures["AreaShape1"].GetShape();saLayer.Open();saLayer.EditTools.BeginTransaction();saLayer.EditTools.Union("AreaShape2", targetShape);saLayer.EditTools.Delete("AreaShape1");saLayer.EditTools.CommitTransaction();saLayer.Close();`

And&nbsp;this&nbsp;is&nbsp;the&nbsp;same&nbsp;development&nbsp;for&nbsp;merging&nbsp;(union)&nbsp;of&nbsp;my&nbsp;zip&nbsp;codes&nbsp;(&nbsp;features).&nbsp;It&nbsp;does&nbsp;not&nbsp;work.

`AreaBaseShape targetSA = (AreaBaseShape)saLayer.InternalFeatures["08812"].GetShape();saLayer.Open();saLayer.EditTools.BeginTransaction();saLayer.EditTools.Union("08846", targetSA);saLayer.EditTools.Delete("08812");saLayer.EditTools.CommitTransaction();saLayer.Close(); `

&nbsp;

Here&nbsp;is&nbsp;my&nbsp;full&nbsp;source&nbsp;code.&nbsp;Would&nbsp;you&nbsp;please&nbsp;let&nbsp;me&nbsp;know&nbsp;what&nbsp;is&nbsp;that&nbsp;I&nbsp;need&nbsp;to&nbsp;modify&nbsp;to&nbsp;make&nbsp;it&nbsp;work?

Please&nbsp;let&nbsp;me&nbsp;know&nbsp;to&nbsp;(shwe.ko@cegedim.com)&nbsp;if&nbsp;you&nbsp;need&nbsp;shape&nbsp;file.

&nbsp;

` using System;using System.Collections.Specialized;using System.Collections.Generic;using System.Collections.ObjectModel;using System.Collections;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.IO;using ThinkGeo.MapSuite.Core;using ThinkGeo.MapSuite.WebEdition;namespace NJTerritory2{    public partial class WebForm17 : System.Web.UI.Page    {        Dictionary<string, ArrayList> g_SalesAreaZips = new Dictionary<string, ArrayList>();        protected void Page_Load(object sender, EventArgs e)        {            if (!IsPostBack)            {                Map1.MapUnit = GeographyUnit.DecimalDegree;                Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);                Map1.MapTools.MouseCoordinate.Enabled = true;                ShapeFileFeatureSource.BuildIndexFile(@"C:\temp\WebSites\ThinkGeo\Data\NJ\tl_2010_34_zcta510.shp", @"C:\temp\WebSites\ThinkGeo\Data\NJ\tl_2010_34_zcta510.idx", "ZCTA5CE10", "\\w", BuildIndexMode.DoNotRebuild);                FillSalesAreas();                //===============================                ShapeFileFeatureLayer stateLayer = new ShapeFileFeatureLayer(@"C:\temp\WebSites\ThinkGeo\Data\NJ\tl_2010_34_zcta510.shp", @"C:\temp\WebSites\ThinkGeo\Data\NJ\tl_2010_34_zcta510.idx");                stateLayer.Name = "StateLayer";                stateLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Park1;                stateLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;//20 is zoomest                //stateLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.CreateSimpleTextStyle("ZCTA5CE10", "Arial", 8, DrawingFontStyles.Italic, GeoColor.StandardColors.Black, 3, 3);                Map1.StaticOverlay.Layers.Add(stateLayer);                //=================================                LayerOverlay saOverlay = new LayerOverlay();                saOverlay.Name = "SAOverlay";                                foreach (string saName in g_SalesAreaZips.Keys)                    CreateSalesAreaLayer(saOverlay, saName);                saOverlay.IsBaseOverlay = false;                Map1.CustomOverlays.Add(saOverlay);                foreach (string saName in g_SalesAreaZips.Keys)                    MergeThem(saName);                //================================                Map1.CurrentExtent = GetFullExtent(stateLayer);            }        }        private void CreateSalesAreaLayer(LayerOverlay saOverlay, string saName)        {            if (g_SalesAreaZips.ContainsKey(saName))            {                InMemoryFeatureLayer saZipsLayer = new InMemoryFeatureLayer();                saZipsLayer.Name = saName;                //saZipsLayer.Open();                //saZipsLayer.Columns.Add(new FeatureSourceColumn("ZCTA5CE10"));                //saZipsLayer.Close();                saZipsLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.FromArgb(150, GeoColor.StandardColors.Brown), GeoColor.FromArgb(150, GeoColor.StandardColors.Aqua));                saZipsLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;                //saZipsLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.CreateSimpleTextStyle("ZCTA5CE10", "Arial", 8, DrawingFontStyles.Italic, GeoColor.StandardColors.Black, 3, 3);                //==================                BaseShape areaShape1 = new RectangleShape(-75, 40, -74.75, 39.75);                areaShape1.Id = "AreaShape1";                BaseShape areaShape2 = new RectangleShape(-74.85, 39.85, -74.5, 39.6);                areaShape2.Id = "AreaShape2";                saZipsLayer.InternalFeatures.Add("AreaShape1", new Feature(areaShape1));                saZipsLayer.InternalFeatures.Add("AreaShape2", new Feature(areaShape2));                //==================                Collection<string> columnNames = new Collection<string>();                columnNames.Add("ZCTA5CE10");                LayerOverlay stateOverlay = (LayerOverlay)Map1.StaticOverlay;//stateOverlay                ShapeFileFeatureLayer stateLayer = (ShapeFileFeatureLayer)stateOverlay.Layers[0];                stateLayer.Open();                Collection<Feature> features = stateLayer.FeatureSource.GetAllFeatures(columnNames);                stateLayer.Close();                ArrayList zips = g_SalesAreaZips[saName];                foreach (string zip in zips)                {                    foreach (Feature f in features)                    {                        if (f.ColumnValues["ZCTA5CE10"] != zip) continue;                        if (!saZipsLayer.InternalFeatures.Contains(f))                            saZipsLayer.InternalFeatures.Add(zip, f);                    }                }                saOverlay.Layers.Add(saName, saZipsLayer);            }        }        private void MergeThem(string saName)        {            InMemoryFeatureLayer saLayer = null;            LayerOverlay saOverlay = (LayerOverlay)Map1.CustomOverlays[0];//SAOverlay                        try            {                saLayer = (InMemoryFeatureLayer)saOverlay.Layers[saName];            }            catch (Exception ex)            {                //does nothing            }            AreaBaseShape targetShape = (AreaBaseShape)saLayer.InternalFeatures["AreaShape1"].GetShape();            saLayer.Open();            saLayer.EditTools.BeginTransaction();            saLayer.EditTools.Union("AreaShape2", targetShape);            saLayer.EditTools.Delete("AreaShape1");            saLayer.EditTools.CommitTransaction();            saLayer.Close();                        //---------------            AreaBaseShape targetSA = (AreaBaseShape)saLayer.InternalFeatures["08812"].GetShape();            saLayer.Open();            saLayer.EditTools.BeginTransaction();            saLayer.EditTools.Union("08846", targetSA);            saLayer.EditTools.Delete("08812");            saLayer.EditTools.CommitTransaction();            saLayer.Close();                        saOverlay.Redraw();        }        private void FillSalesAreas()        {            ArrayList zips = new ArrayList();            zips.Add("08812");            zips.Add("08846");            g_SalesAreaZips.Add("SALESAREA1", zips);        }        private RectangleShape GetFullExtent(Layer layer)        {            Collection<BaseShape> rectangleShapes = new Collection<BaseShape>();            layer.Open();            if (layer.HasBoundingBox == true)                rectangleShapes.Add(layer.GetBoundingBox());            return ExtentHelper.GetBoundingBoxOfItems(rectangleShapes);        }    }}`

---

<div class="post-metadata">

**Author:** ![shwe](https://community.thinkgeo.com/letter_avatar_proxy/v4/letter/s/ed8c4c/32.png) [@shwe](https://community.thinkgeo.com/u/shwe)\
**Post date:** [January 2, 2012, 2:23pm UTC](https://community.thinkgeo.com/t/union-two-features/6082/2 "2012-01-02T14:23:19Z")

</div>

Please&nbsp;comment&nbsp;out&nbsp;below&nbsp;lines&nbsp;from&nbsp;the&nbsp;provided&nbsp;source&nbsp;code&nbsp;to&nbsp;see&nbsp;how&nbsp;does&nbsp;it&nbsp;look&nbsp;like&nbsp;before&nbsp;merging.

&nbsp;

`foreach (string saName in g_SalesAreaZips.Keys)   MergeThem(saName); `  
  
thank&nbsp;you  
shwe

---

<div class="post-metadata">

**Author:** ![Ethan](https://community.thinkgeo.com/user_avatar/community.thinkgeo.com/ethan/32/19964_2.png) [@Ethan](https://community.thinkgeo.com/u/Ethan)\
**Post date:** [January 4, 2012, 2:11pm UTC](https://community.thinkgeo.com/t/union-two-features/6082/3 "2012-01-04T14:11:00Z")

</div>

Hi&nbsp;Shwe,&nbsp;  
&nbsp;&nbsp;  
&nbsp;Thanks&nbsp;for&nbsp;your&nbsp;post.&nbsp;  
&nbsp;&nbsp;  
&nbsp;I&nbsp;am&nbsp;looking&nbsp;at&nbsp;your&nbsp;question.&nbsp;  
&nbsp;&nbsp;  
&nbsp;Regards,&nbsp;  
&nbsp;&nbsp;  
&nbsp;Don

---

<div class="post-metadata">

**Author:** ![Ethan](https://community.thinkgeo.com/user_avatar/community.thinkgeo.com/ethan/32/19964_2.png) [@Ethan](https://community.thinkgeo.com/u/Ethan)\
**Post date:** [January 9, 2012, 12:03pm UTC](https://community.thinkgeo.com/t/union-two-features/6082/4 "2012-01-09T12:03:00Z")

</div>

Hi&nbsp;Shwe,&nbsp;&nbsp;  
&nbsp;&nbsp;  
&nbsp;I&nbsp;sent&nbsp;email&nbsp;to&nbsp;your&nbsp;mailbox&nbsp;but&nbsp;get&nbsp;looks&nbsp;fail.&nbsp;  
&nbsp;&nbsp;  
&nbsp;Could&nbsp;you&nbsp;sent&nbsp;your&nbsp;shape&nbsp;file&nbsp;to&nbsp;[support@thinkgeo.com](mailto:support@thinkgeo.com)&nbsp;and&nbsp;ask&nbsp;him&nbsp;forward&nbsp;to&nbsp;me?&nbsp;  
&nbsp;&nbsp;  
&nbsp;Regards,&nbsp;  
&nbsp;&nbsp;  
&nbsp;Don&nbsp;  
&nbsp;&nbsp;
