OVERRIDDEN: Initialize required FGDC data map with XPATHS and specialized functions

def _init_data_map(self):
        """ OVERRIDDEN: Initialize required FGDC data map with XPATHS and specialized functions """

        if self._data_map is not None:
            return  # Initiation happens once

        # Parse and validate the ArcGIS metadata root

        if self._xml_tree is None:
            agis_root = ARCGIS_ROOTS[0]  # Default to uncapitalized
        else:
            agis_root = get_element_name(self._xml_tree)

        if agis_root not in ARCGIS_ROOTS:
            raise InvalidContent('Invalid XML root for ArcGIS metadata: {root}', root=agis_root)

        agis_data_map = {'_root': agis_root}
        agis_data_map.update(_agis_tag_formats)

        agis_data_structures = {}

        # Capture and format complex XPATHs

        ad_format = agis_data_map[ATTRIBUTES]
        agis_data_structures[ATTRIBUTES] = format_xpaths(
            _agis_definitions[ATTRIBUTES],
            label=ad_format.format(ad_path='attrlabl'),
            aliases=ad_format.format(ad_path='attalias'),
            definition=ad_format.format(ad_path='attrdef'),
            definition_src=ad_format.format(ad_path='attrdefs')
        )

        bb_format = agis_data_map[BOUNDING_BOX]
        agis_data_structures[BOUNDING_BOX] = format_xpaths(
            _agis_definitions[BOUNDING_BOX],
            east=bb_format.format(bbox_path='eastBL'),
            south=bb_format.format(bbox_path='southBL'),
            west=bb_format.format(bbox_path='westBL'),
            north=bb_format.format(bbox_path='northBL')
        )

        ct_format = agis_data_map[CONTACTS]
        agis_data_structures[CONTACTS] = format_xpaths(
            _agis_definitions[CONTACTS],
            name=ct_format.format(ct_path='rpIndName'),
            organization=ct_format.format(ct_path='rpOrgName'),
            position=ct_format.format(ct_path='rpPosName'),
            email=ct_format.format(ct_path='rpCntInfo/cntAddress/eMailAdd')
        )

        dt_format = agis_data_map[DATES]
        agis_data_structures[DATES] = {
            DATE_TYPE_MULTIPLE: dt_format.format(type_path='TM_Instant/tmPosition'),
            '_' + DATE_TYPE_MULTIPLE: dt_format.format(type_path='TM_Instant/tmPosition/@date'),
            DATE_TYPE_RANGE_BEGIN: dt_format.format(type_path='TM_Period/tmBegin'),
            '_' + DATE_TYPE_RANGE_BEGIN: dt_format.format(type_path='TM_Period/tmBegin/@date'),
            DATE_TYPE_RANGE_END: dt_format.format(type_path='TM_Period/tmEnd'),
            '_' + DATE_TYPE_RANGE_END: dt_format.format(type_path='TM_Period/tmEnd/@date'),

            # Same as multiple dates, but will contain only one
            DATE_TYPE_SINGLE: dt_format.format(type_path='TM_Instant/tmPosition'),
            '_' + DATE_TYPE_SINGLE: dt_format.format(type_path='TM_Instant/tmPosition/@date')
        }
        agis_data_structures[DATES][DATE_TYPE_RANGE] = [
            agis_data_structures[DATES][DATE_TYPE_RANGE_BEGIN],
            agis_data_structures[DATES][DATE_TYPE_RANGE_END]
        ]
        agis_data_structures[DATES]['_' + DATE_TYPE_RANGE] = [
            agis_data_structures[DATES]['_' + DATE_TYPE_RANGE_BEGIN],
            agis_data_structures[DATES]['_' + DATE_TYPE_RANGE_END]
        ]

        df_format = agis_data_map[DIGITAL_FORMS]
        agis_data_structures[DIGITAL_FORMS] = format_xpaths(
            _agis_definitions[DIGITAL_FORMS],
            name=df_format.format(df_path='formatName'),
            content=df_format.format(df_path='formatInfo'),
            decompression=df_format.format(df_path='fileDecmTech'),
            version=df_format.format(df_path='formatVer'),
            specification=df_format.format(df_path='formatSpec'),
            access_desc=agis_data_map['_access_desc'],
            access_instrs=agis_data_map['_access_instrs'],
            network_resource=agis_data_map['_network_resource']
        )

        lw_format = agis_data_map[LARGER_WORKS]
        agis_data_structures[LARGER_WORKS] = format_xpaths(
            _agis_definitions[LARGER_WORKS],
            title=lw_format.format(lw_path='resTitle'),
            edition=lw_format.format(lw_path='resEd'),
            origin=lw_format.format(lw_path='citRespParty/rpIndName'),
            online_linkage=lw_format.format(lw_path='citRespParty/rpCntInfo/cntOnlineRes/linkage'),
            other_citation=lw_format.format(lw_path='otherCitDet'),
            date=lw_format.format(lw_path='date/pubDate'),
            place=lw_format.format(lw_path='citRespParty/rpCntInfo/cntAddress/city'),
            info=lw_format.format(lw_path='citRespParty/rpOrgName')
        )

        ps_format = agis_data_map[PROCESS_STEPS]
        agis_data_structures[PROCESS_STEPS] = format_xpaths(
            _agis_definitions[PROCESS_STEPS],
            description=ps_format.format(ps_path='stepDesc'),
            date=ps_format.format(ps_path='stepDateTm'),
            sources=ps_format.format(ps_path='stepSrc/srcDesc')
        )

        ri_format = agis_data_map[RASTER_INFO]
        agis_data_structures[RASTER_INFO] = format_xpaths(
            _agis_definitions[RASTER_DIMS],
            type=ri_format.format(ri_path='@type'),
            size=ri_format.format(ri_path='dimSize'),
            value=ri_format.format(ri_path='dimResol/value'),
            units=ri_format.format(ri_path='dimResol/value/@uom')
        )

        # Assign XPATHS and gis_metadata.utils.ParserProperties to data map

        for prop, xpath in iteritems(dict(agis_data_map)):
            if prop in (ATTRIBUTES, CONTACTS, PROCESS_STEPS):
                agis_data_map[prop] = ParserProperty(self._parse_complex_list, self._update_complex_list)

            elif prop in (BOUNDING_BOX, LARGER_WORKS):
                agis_data_map[prop] = ParserProperty(self._parse_complex, self._update_complex)

            elif prop in ('attribute_accuracy', 'dataset_completeness'):
                agis_data_map[prop] = ParserProperty(self._parse_report_item, self._update_report_item)

            elif prop == DATES:
                agis_data_map[prop] = ParserProperty(self._parse_dates, self._update_dates)

            elif prop == DIGITAL_FORMS:
                agis_data_map[prop] = ParserProperty(self._parse_digital_forms, self._update_digital_forms)

            elif prop == RASTER_INFO:
                agis_data_map[prop] = ParserProperty(self._parse_raster_info, self._update_raster_info)

            else:
                agis_data_map[prop] = xpath

        self._data_map = agis_data_map
        self._data_structures = agis_data_structures