/// <summary>
 /// A MultiPoint is simple if it has no repeated points.
 /// </summary>
 public virtual bool IsSimple(MultiPoint mp)
 {
     if (mp.IsEmpty) 
         return true;
     ISet points = new ListSet();
     for (int i = 0; i < mp.NumGeometries; i++)
     {
         Point pt = (Point)mp.GetGeometryN(i);
         Coordinate p = pt.Coordinate;
         if (points.Contains(p))
             return false;
         points.Add(p);
     }
     return true;
 }   
 /// <summary>
 /// 
 /// </summary>
 /// <param name="multiPoint"></param>
 /// <returns></returns>
 protected virtual int SetByteStreamLength(MultiPoint multiPoint)
 {
     int count = InitValue;
     foreach (Point p in multiPoint.Geometries)
         count += SetByteStreamLength(p);
     return count;
 }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="multiPoint"></param>
 /// <param name="writer"></param>
 protected virtual void Write(MultiPoint multiPoint, XmlTextWriter writer)
 {
     writer.WriteStartElement("MultiPoint");
     for (int i = 0; i < multiPoint.NumGeometries; i++)
     {
         writer.WriteStartElement("pointMember");
         Write(multiPoint.Geometries[i] as Point, writer);
         writer.WriteEndElement();
     }
     writer.WriteEndElement();
 }
 protected IFeature GetMultiPoint(int index)
 {
     ShapeRange shape = ShapeIndices[index];
     List<Coordinate> coords = new List<Coordinate>();
     foreach (PartRange part in shape.Parts)
     {
         int i = part.StartIndex;
         foreach (Vertex vertex in part)
         {
             Coordinate c = new Coordinate(vertex);
             coords.Add(c);
             if (M != null && M.Length != 0) c.M = M[i]; 
             if (Z != null && Z.Length != 0) c.Z = Z[i];
             i++;
         }
     }
     MultiPoint mp = new MultiPoint(coords);
     return new Feature(mp);
 }