I am trying to create a multipart polygon based on 3 x 5 squares, but when I look at the result it dissolves the polygons and the enclosed squares are no longer part of it. If I do the same and store the result as a line (also multipart), the inner parts do appear in the result.

Can anyone explain me what I am doing wrong or show me how I can create a valid multipart polygon that consists in this case of 15 partes?
This is the code that I used.
import arcpy
# a square
part = [[0,0],[0,1],[1,1],[1,0],[0,0]]
mp = []
for x_shift in range(0,3):
for y_shift in range(0,5):
part_new = [[x+x_shift,y+y_shift] for [x,y] in part]
print part_new
mp.append(part_new)
# the nested list for the multipart
##mp = [[[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]],
## [[0, 1], [0, 2], [1, 2], [1, 1], [0, 1]],
## [[0, 2], [0, 3], [1, 3], [1, 2], [0, 2]],
## [[0, 3], [0, 4], [1, 4], [1, 3], [0, 3]],
## [[0, 4], [0, 5], [1, 5], [1, 4], [0, 4]],
## [[1, 0], [1, 1], [2, 1], [2, 0], [1, 0]],
## [[1, 1], [1, 2], [2, 2], [2, 1], [1, 1]],
## [[1, 2], [1, 3], [2, 3], [2, 2], [1, 2]],
## [[1, 3], [1, 4], [2, 4], [2, 3], [1, 3]],
## [[1, 4], [1, 5], [2, 5], [2, 4], [1, 4]],
## [[2, 0], [2, 1], [3, 1], [3, 0], [2, 0]],
## [[2, 1], [2, 2], [3, 2], [3, 1], [2, 1]],
## [[2, 2], [2, 3], [3, 3], [3, 2], [2, 2]],
## [[2, 3], [2, 4], [3, 4], [3, 3], [2, 3]],
## [[2, 4], [2, 5], [3, 5], [3, 4], [2, 4]]]
# construct the array for the feature
lst_part = []
for part in mp:
lst_pnt = []
for pnt in part:
lst_pnt.append(arcpy.Point(float(pnt[0]), float(pnt[1])))
lst_part.append(arcpy.Array(lst_pnt))
array = arcpy.Array(lst_part)
# handle the array as polygon
polygon = arcpy.Polygon(array)
arcpy.CopyFeatures_management([polygon], r"D:\Xander\GeoNet\MultiPart\data.gdb\test_pol_mp")
print "Polygon partCount : {0}".format(polygon.partCount)
print "Polygon pointCount: {0}".format(polygon.pointCount)
# handle the array as polyline
polyline = arcpy.Polyline(array)
arcpy.CopyFeatures_management([polyline], r"D:\Xander\GeoNet\MultiPart\data.gdb\test_line_mp")
print "Polyline partCount : {0}".format(polyline.partCount)
print "Polyline pointCount: {0}".format(polyline.pointCount)
Solved! Go to Solution.
Fine with me, although I just copy/pasted from here:
hahaha .... but you see "editing" to me is on-screen digitizing etc...I never do it, so rarely check that section. I think the reference should at the least be duplicated within the union etc sections and at least within the arcpy section...and I have noted it as such...So you will get kudos for bringing the jackass to water ![]()
Since the OGC Simple Feature Access - Part 1: Common Architecture doesn't allow parts of a multipart polygon to share edges, what you are really after is either a geometry bag or geometry collection, neither of which are implemented in ArcPy. Even if ArcPy implemented geometry bags, you still can't store them in a feature class because Esri doesn't have a geometry bag/collection type for feature classes.
If you work outside of ArcGIS, in SQL Server for example, you can build and store a geometry collection. Using your original example and a SQL Server workspace, you can see what I am speaking to:
import arcpy
# a square
part = [[0,0],[0,1],[1,1],[1,0],[0,0]]
mp = ""
for x_shift in range(0,3):
for y_shift in range(0,5):
new_part = ", ".join(["{} {}".format(x+x_shift,y+y_shift) for [x,y] in part])
mp = "{}, POLYGON(({}))".format(mp, new_part)
mp = mp[2:]
sqlWS = #SQL Server or SQL Server Express SDE connection file
out_name = "test_pol_mp"
fc = arcpy.CreateFeatureclass_management(sqlWS, out_name, "POLYGON")
shape = arcpy.Describe(fc).shapeFieldName
sde_conn = arcpy.ArcSDESQLExecute(sqlWS)
sql = ("INSERT INTO {} ({}) "
"VALUES (\'GEOMETRYCOLLECTION({})\')".format(out_name, shape, mp))
sde_conn.execute(sql)
sql = ("SELECT [{}].STNumGeometries() AS partCount, "
"[{}].STNumPoints() AS pointCount "
"FROM {}".format(shape, shape, out_name))
partCount, pointCount = sde_conn.execute(sql)[0]
print "Polygon partCount : {0}".format(partCount)
print "Polygon pointCount: {0}".format(pointCount)
#... Polygon partCount : 15
#... Polygon pointCount: 75Viewing the geometry collection in SQL Server Management Studio gives:
Wheres trying to view it in ArcMap gives: