http://gadm.org/ (Gadm) contains world wide administrative areas down to 2 or 3 levels under countries. For iKartan, municipalities for the whole world is downloaded.
Gadm database
The gadm database is created by the Geokettle script CreateGadmDB.kjb, basically just a SQL script
create schema gadm;
CREATE TABLE gadm.gadm
(
objectid integer NOT NULL,
id_0 integer,
iso character varying(5),
name_0 character varying(50),
id_1 integer,
name_1 character varying(50),
type_1 character varying(50),
id_2 integer,
name_2 character varying(70),
type_2 character varying(50),
id_3 integer,
name_3 character varying(70),
the_geom geometry,
CONSTRAINT gadm7_pkey PRIMARY KEY (objectid ),
CONSTRAINT enforce_dims_the_geom CHECK (st_ndims(the_geom) = 2),
CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 4326)
);
Name_0 is the country, Name_1 is the first order administrative areas etc.
ISO is a three letter country code
Getting the data
The Geokettle job GetGadmFromTheWeb.kjb is used to get the data from the web, unpack and store it to the database. The data is replaced

Weave configuration
Database
Includes configuration for entity, data, search and index. Data definitions for lookup lists for countries, codes and index is included.
The configuration is using two ACL : acl.entity.globalmap.gadm to allow index search and acl.data.globalmap.gadm to search and list data.
Two user attributes is used to filter data:
- user.customers.globalmap.gadm.name_0 is used to filter countries.
- user.customers.globalmap.gadm.name_1 is used to filter first order administrative areas.
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns= "urn:com.cohga.server.config#1.0"
xmlns:dmsstorage="urn:com.cohga.dms.storage.document.db#1.0"
xmlns:cache= "urn:com.cohga.server.cache#1.0"
xmlns:acl= "urn:com.cohga.server.acl#1.0"
xmlns:pool= "urn:com.cohga.server.pool#1.0"
xmlns:options= "urn:com.cohga.server.options#1.0"
xmlns:parameter="urn:com.cohga.server.parameter#1.0"
xmlns:search= "urn:com.cohga.server.search.database#1.0"
xmlns:birt= "urn:com.cohga.server.report.birt#1.0"
xmlns:data= "urn:com.cohga.server.data.database#1.0"
xmlns:entity= "urn:com.cohga.server.entity#1.0"
xmlns:jdbc= "urn:com.cohga.server.datasource.jdbc#1.0"
xmlns:arcgisws= "urn:com.cohga.server.map.arcgis.ws#1.0"
xmlns:arcims= "urn:com.cohga.server.map.arcims#1.0"
xmlns:mapper= "urn:com.cohga.server.spatial.mapper#1.0"
xmlns:spatial= "urn:com.cohga.server.spatial.geotools#1.0"
xmlns:index= "urn:com.cohga.server.index#1.0"
xmlns:toc= "urn:com.cohga.server.map.toc#1.0"
xmlns:client= "urn:com.cohga.html.client#1.0"
xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd= "http://www.w3.org/2001/XMLSchema"
xmlns:wms = "urn:com.cohga.server.map.wms#1.0"
xmlns:edit= "urn:com.cohga.spatial.edit#1.0"
xmlns:editor="urn:com.cohga.server.editor#1.0">
<!-- Global map -->
<entity:entity id="entity.globalmap.gadm" label = "%globalmap.gadm.entity" acl="acl.entity.globalmap.gadm" />
<mapper:mapper id="mapper.globalmap.gadm">
<spatialEngine>spatialengine.globalmap_gadm</spatialEngine>
<acl>acl.data.globalmap.gadm</acl>
<mapping>
<entity>entity.globalmap.gadm</entity>
<table>gadm</table>
<key>objectid</key>
<filter>name_0 like'${user.customers.globalmap.gadm.name_0}'</filter>
<filter>name_1 like'${user.customers.globalmap.gadm.name_1}'</filter>
<dynamic/>
<cache disable="true" />
</mapping>
</mapper:mapper>
<data:data id="d.globalmap.gadm" label="%globalmap.gadm.entity" entity="entity.globalmap.gadm" datadefinition="dd.globalmap.gadm" acl="acl.data.globalmap.gadm" />
<data:datadefinition id='dd.globalmap.gadm'>
<datasourcedataconnection key='objectid' table='gadm.gadm' datasource='ds.globalmap'>
<!--
<parameter name='objectid' label='Objectid' column='objectid' type='int'/>
<parameter name='id_0' label='Id 0' column='id_0' type='int'/>
<parameter name='iso' label='Iso' column='iso'/>
<parameter name='id_1' label='Id 1' column='id_1' type='int'/>
<parameter name='type_1' label='Type 1' column='type_1'/>
<parameter name='id_2' label='Id 2' column='id_2' type='int'/>
<parameter name='type_2' label='Type 2' column='type_2'/>
<parameter name='id_3' label='Id 3' column='id_3' type='int'/>
-->
<parameter name='name_0' label='%globalmap.gadm.name_0' column='name_0'/>
<parameter name='name_1' label='%globalmap.gadm.name_1' column='name_1'/>
<parameter name='name_2' label='%globalmap.gadm.name_2' column='name_2'/>
<parameter name='name_3' label='%globalmap.gadm.name_3' column='name_3'/>
<parameter name='area_km2' label='%globalmap.gadm.area_km2' column="ST_Area(the_geom::geography)::bigint/1000000"/>
</datasourcedataconnection>
</data:datadefinition>
<data:data id="d_gadm_group_total" label="%globalmap.gadm.total_area" entity="entity.globalmap.gadm" datadefinition="dd_gadm_group_total" acl="acl.data.globalmap.gadm" />
<data:datadefinition id="dd_gadm_group_total">
<groupdataconnection datadefinition="dd.globalmap.gadm">
<parameter name="count" label="%globalmap.gadm.number_of" column ="count(name_3)" />
<parameter name="sum_area" label="%globalmap.gadm.area_km2" column ="sum(area_km2)" />
</groupdataconnection>
</data:datadefinition>
<data:data id="d_gadm_group_country" label="%globalmap.gadm.area_per_country" entity="entity.globalmap.gadm" datadefinition="dd_gadm_group_country" acl="acl.data.globalmap.gadm" />
<data:datadefinition id="dd_gadm_group_country">
<groupdataconnection datadefinition="dd.globalmap.gadm">
<parameter name="name_0" label="%globalmap.gadm.name_0" column ="name_0" />
<parameter name="count" label="%globalmap.gadm.number_of" column ="count(name_3)" />
<parameter name="sum_area" label="%globalmap.gadm.area_km2" column ="sum(area_km2)" />
<group column="name_0"/>
</groupdataconnection>
</data:datadefinition>
<data:data id="d_gadm_group_name_1" label="Area per name_1" entity="entity.globalmap.gadm" datadefinition="dd_gadm_group_name_1" acl="acl.data.globalmap.gadm" />
<data:datadefinition id="dd_gadm_group_name_1">
<groupdataconnection datadefinition="dd.globalmap.gadm">
<parameter name="name_0" label="%globalmap.gadm.name_0" column ="name_0" />
<parameter name="name_1" label="%globalmap.gadm.name_1" column ="name_1" />
<parameter name="count" label="%globalmap.gadm.number_of" column ="count(name_3)" />
<parameter name="sum_area" label="%globalmap.gadm.area_km2" column ="sum(area_km2)" />
<group column="name_1"/>
</groupdataconnection>
</data:datadefinition>
<data:datadefinition id='dd_list.globalmap.gadm'>
<datasourcedataconnection table='gadm.gadm' datasource='ds.globalmap' prefix="distinct">
<where clause="name_0 like'${user.customers.globalmap.gadm.name_0}'"/>
<where clause="name_1 like'${user.customers.globalmap.gadm.name_1}'" />
<parameter name='name_0' column='name_0'/>
<parameter name='name_1' column='name_1'/>
<parameter name='name_2' column='name_2'/>
<parameter name='name_3' column='name_3'/>
</datasourcedataconnection>
</data:datadefinition>
<search:attribute id="sa.globalmap.gadm">
<acl>acl.data.globalmap.gadm</acl>
<entity>entity.globalmap.gadm</entity>
<description>%globalmap.gadm.search</description>
<displayName>%globalmap.gadm.search</displayName>
<dataSource>ds.globalmap</dataSource>
<table>gadm.gadm</table>
<key>objectid</key>
<where clause="name_0 like'${user.customers.globalmap.gadm.name_0}'"/>
<where clause="name_1 like'${user.customers.globalmap.gadm.name_1}'" />
<parameter id="Country_subnames" >
<dataset>dd_list.globalmap.gadm</dataset>
<parameter id ="name_0">
<promptText>%globalmap.gadm.name_0</promptText>
<controltype>listbox</controltype>
<column>name_0</column>
<valuecolumn>name_0</valuecolumn>
<labelcolumn>name_0</labelcolumn>
<dataType>string</dataType>
<allowblank>false</allowblank>
</parameter>
<parameter id ="name_1">
<promptText>%globalmap.gadm.name_1</promptText>
<controltype>listbox</controltype>
<column>name_1</column>
<valuecolumn>name_1</valuecolumn>
<labelcolumn>name_1</labelcolumn>
<dataType>string</dataType>
<allowblank>true</allowblank>
</parameter>
<parameter id ="name_2">
<promptText>%globalmap.gadm.name_2</promptText>
<controltype>listbox</controltype>
<column>name_2</column>
<valuecolumn>name_2</valuecolumn>
<labelcolumn>name_2</labelcolumn>
<dataType>string</dataType>
<allowblank>true</allowblank>
</parameter>
<parameter id ="name_3">
<promptText>%globalmap.gadm.name_3</promptText>
<controltype>listbox</controltype>
<column>name_3</column>
<valuecolumn>name_3</valuecolumn>
<labelcolumn>name_3</labelcolumn>
<dataType>string</dataType>
<allowblank>true</allowblank>
</parameter>
</parameter>
<cache disable="true"/>
</search:attribute>
<data:datadefinition id='dd.index.globalmap.gadm'>
<datasourcedataconnection key='objectid' table='gadm.gadm' datasource='ds.globalmap'>
<parameter name='name_0_lower' column='lower(name_0)'/>
<parameter name='name_1_lower' column='lower(name_1)'/>
<parameter name='name_0' label='%globalmap.gadm.name_0' column='name_0'/>
<parameter name='name_1' label='%globalmap.gadm.name_1' column='name_1'/>
<parameter name='name_2' label='%globalmap.gadm.name_2' column='name_2'/>
<parameter name='name_3' label='%globalmap.gadm.name_3' column='name_3'/>
</datasourcedataconnection>
</data:datadefinition>
<index:entity id="index.globalmap.gadm">
<entity>entity.globalmap.gadm</entity>
<fields>
<datadefinition>dd.index.globalmap.gadm</datadefinition>
<field name="customers.globalmap.gadm.name_0" value="name_0_lower"/>
<field name="customers.globalmap.gadm.name_1" value="name_1_lower"/>
</fields>
<weight>2</weight>
<display>
<datadefinition>dd.index.globalmap.gadm</datadefinition>
<level1><![CDATA[
<div>
<img src="custom/resources/icons/world_tool.png" style=" float: left; padding-right:10px; height:16px; margin-left: -5px; padding-bottom: 1px;"></img>
<div>
<div style="display: inline-block; font-size:14px;font-weight: normal;">${name_3} ${name_2} </div>
<div style="display: inline-block; font-size:12px;font-weight: normal;color:gray;"> ${name_1} ${name_0}</div>
</div>
</div>
]]></level1>
</display>
<keywords>
<datadefinition>dd.index.globalmap.gadm</datadefinition>
<level1>${name_2}</level1>
<level2>${name_1}</level2>
<level3>${name_0}</level3>
<level4>${name_3}</level4>
</keywords>
<!--
<schedule>0 0 06 1</schedule>
-->
<schedule>0 0 26 3</schedule>
</index:entity>
</config>
Desktop client
In the client_desktop.xml under weave.entitySelectorView the line <entity acl="acl.data.globalmap.gadm">entity.globalmap.gadm</entity> is insterted.
iKartan Admin
Contract group is "Open data worldwide"
Product "administrative areas: Quick search" is connected to ACL acl.entity.globalmap.gadm
Product "administrative areas: Analyze" is connected to ACL acl.entity.globalmap.gadm and acl.data.globalmap.gadm
The GADM part of the data definition created for Weave looks like:
<!-- acl.entity.globalmap.gadm -->
<acl:acl id="acl.entity.globalmap.gadm">
<entry type="allow">geoadm_analyze</entry>
<entry type="allow">geoadm_quicksearch</entry>
<entry type="deny">*</entry>
</acl:acl>
<!-- acl.data.globalmap.gadm -->
<acl:acl id="acl.data.globalmap.gadm">
<entry type="allow">geoadm_analyze</entry>
<entry type="deny">*</entry>
</acl:acl>