How to programmatically create a multipart vector file in ENVI Classic
ENVI's EVF routines allow you to define a multipart polygon programmatically using the PARTS_PTR and TYPE keywords. The code example in this Help Article provides an example of creating a single, large polygon with three 'holes' within the polygon.
The following example code shows how to create a multipart polygon using ENVI's EVF routines. The code uses the documented routines, ENVI_EVF_DEFINE_INIT, ENVI_EVF_DEFINE_ADD_RECORD, and ENVI_EVF_DEFINE_CLOSE. When adding points to the record, you can specify the PARTS_PTR and TYPE keywords to denote the polygon is a multipart polygon. The key is that when you specify the points for the polygon, the main polygon points are specified first, then the points for the holes. The PARTS_PTR keyword tells ENVI how to order them in the file.
In the following code example, there is a total of 33 points defining the polygon and 3 holes within the polygon. The first 7 points define the main polygon, the next 10 define the first hole, the next 8 define the second hole, and the last 7 define the third hole. The PARTS_PTR keyword is set up as:
parts_ptr = [0L, 7, -17, -25, -32]
where the negative sign denotes those nodes are multipart.
Multipart polygons are of the vector type '5' in ENVI.
------------------------------------------------------------------------
pro create_multipart_vector
; Create a projection for the points
;the points in this example are in UTM easting/northing
proj = envi_proj_create(/utm, zone=13)
;
; define a polygon in easting/northing coordinates
; note first and last coords are identical for each polygon
; first 7 nodes are main polygon, next 10 are first donut,
; next 8 are second donut, last 7 are third donut
polygon = [ $
276165.00, 4903605.0, $
276825.00, 4896075.0, $
276855.00, 4896075.0, $
283815.00, 4896675.0, $
284205.00, 4905135.0, $
276195.00, 4903635.0, $
276165.00, 4903605.0, $
278685.00, 4900035.0, $
278715.00, 4900035.0, $
278715.00, 4900155.0, $
278745.00, 4900155.0, $
279345.00, 4900065.0, $
279345.00, 4899705.0, $
279345.00, 4899675.0, $
279075.00, 4899405.0, $
278775.00, 4899465.0, $
278685.00, 4900035.0, $
281685.00, 4898115.0, $
281895.00, 4898145.0, $
282855.00, 4897965.0, $
282675.00, 4897365.0, $
282045.00, 4897035.0, $
281775.00, 4897395.0, $
281775.00, 4897425.0, $
281685.00, 4898115.0, $
281595.00, 4903395.0, $
281805.00, 4903395.0, $
282825.00, 4903395.0, $
282855.00, 4902645.0, $
282855.00, 4902585.0, $
282075.00, 4902075.0, $
281595.00, 4903395.0]
polygon = reform(polygon, 2, 32)
; Initialize the new EVF file
evf_ptr = envi_evf_define_init('sample.evf', $
projection=proj, $
layer_name='Sample EVF File')
if (ptr_valid(evf_ptr) eq 0) then return
; define parts_ptr as first: main polygon nodes (0-7),
; then first hole (next 10 points specified as negative)
; second hole (next 8 points specified as negative)
; third hole (last 7 points specified as negative)
parts_ptr = [0L, 7, -17, -25, -32]
;add polygon and parts to record - multipart is type 5
envi_evf_define_add_record, evf_ptr, polygon, parts_ptr=parts_ptr, type=5
; Finish defining the new EVF file and close
evf_id = envi_evf_define_close(evf_ptr, /return_id)
envi_evf_close, evf_id
end
Review on 12/31/2013 MM