地図ベースのオリジナル・マッシュアップを作成する

ESRI シェープファイル形式のデータから KML サービスを作成する

最近では地図をベースにしたマッシュアップが巷に溢れています。マッシュアップにはマッシュアップ可能なサービスが必要になりますが、ロケーション・ベースのマッシュアップの場合に必要となるのは境界情報を提供するサービスです。こうしたサービスとして Web ベースの地図提供プロバイダーを使用すれば、資本をほとんど、あるいは一切投資しなくても簡単に地図をベースとしたマッシュアップを作成することができます。この記事を読んで、マッシュアップで使用する KML 境界線データ・サービスを ESRI シェープファイルから作成する方法を学んでください。

Shyam Sundar Nagarajan, Architect, Cognizant Technology Solutions

Shyam photoShyam Sundar Nagarajan は、Cognizant Technology Solution で保険業務のシニア・アーキテクトを務めています。彼はソフトウェア・システムで修士号を取得し、IBM 認定 SOA Associate、および認定スクラム・マスターの資格も取得しました。関心のある分野は、オープンソース、GIS、そしてマッシュアップです。



2010年 1月 19日

はじめに

最近は、地図をベースとしたマッシュアップが至るところに溢れています。その主な理由は、マッシュアップに利用できるサービスが普及しているためです。地図ベースのマッシュアップの場合には地図上の境界線を提供するサービスが必要となりますが、州、郡、ZIP コード (郵便番号) の境界線に関するデータは、米国国勢調査局 (U.S. Census Bureau) から ESRI (Environmental Systems Research Institute) シェープファイル形式で公開されています。この記事では、オープンソースのソフトウェアを利用して、ESRI シェープファイルから KML ファイルを提供する単純なサービスを作成する方法を紹介します。


技術およびソフトウェア製品

GIS — Geographical Information Systems

KML — Keyhole Markup Language

マッシュアップ — 複数のソースからのデータを組み合わせ、1 つに統合されたエクスペリエンスを提供する Web ハイブリッド・アプリケーション

TIGER — Topologically Integrated Geographic Encoding and Referencing

空間データを処理してマッシュアップを作成するために使用できるツールと製品は、市販、オープンソースを問わず、豊富にあります。この記事の例で使用するのは、いずれもオープンソースのソフトウェアです。以下に説明するように、データベースには PostGIS を使用し、GeoTools Java™ ライブラリーと地図表示用の OpenLayers ライブラリー、そしてアプリケーション・サーバーとして Apache Tomcat を使用します。

PostGIS
オープンソースのリレーショナル・データベース PostgresSQL に対する拡張機能で、空間情報を PostgresSQL で扱えるようにするためのものです。PostGIS は、OpenGIS Simple Features Specification for SQL 標準で規定された空間データ型と関数をサポートします。
GeoTools
空間データを操作するための Java ライブラリーです。GeoTools には以下の内容が含まれます。
  • 各種の空間データ形式 (ESRI シェープファイル、GML (Geography Markup Language)、MIF (MapInfo Interchange Format) など)、および空間データ変換のサポート
  • Vivid Solutions 社が作成した、空間データを表す Java クラスを定義する JTS (Java Topology Suite)

サンプル・ソリューションでは GeoTools で空間データを変換し、JTS でデータベースのバイナリー・ラージ・オブジェクト (BLOB) データをジオメトリーに変換します。

OpenLayers
動的に作成した地図を Web ページに追加できるようにする、オープンソースの地図作成用 JavaScript ライブラリーです。このライブラリーを使って、ベースとなる地図の上にマーカー、線、ポリゴンなどをオーバーレイすることができます。この記事のサンプル・ソリューションでは、OpenLayers の機能を利用して、KML ファイルからベースとなる地図にレイヤーを重ねます。
Apache Tomcat
オープンソースの J2EE JSP およびサーブレット・コンテナーです。このサンプル・ソリューションでは、サービスをデプロイするために使用します。

記事で使用するサンプル・コードをダウンロードしてください。ここで使用するソフトウェアについては、「参考文献」を参照してください。


準備作業

このセクションでは、記事のサンプル・アプリケーションを作成するために必要な予備知識と準備作業について説明します。

論理アーキテクチャー

図 1 に、サンプル・ソリューションの論理アーキテクチャーを示します。

図 1. 論理アーキテクチャー
論理アーキテクチャーを示す図

境界線データ

米国国勢調査局では、TIGER (Topologically Integrated Geographic Encoding and Referencing) 形式のデータベースを使用して、道路や建物、川、湖、人口調査標準地域などの土地の属性を記述し、公開しています。TIGER データベースには、州、郡、市町村、および ZIP コード (郵便番号) による地図上の境界線に関するデータセットが ESRI シェープファイル形式 (「参考文献」を参照) で保管されています。サンプル・アプリケーションでは、ESRI シェープファイル形式の州境界線データを使用します。

データを取得する

米国国勢調査局では州の境界線データセットを ARC/INFO Export (.e00)、ARC/INFO Ungenerate、ESRI シェープファイル (.shp) 形式で提供しています。この記事で使用するのは ESRI シェープファイル形式です。州の境界線データは州ごとに用意されている他、全州の境界線データが含まれるシェープファイルもあります。サンプル・アプリケーションでは、全州を網羅したシェープファイル (st99_d00_shp.zip) を使用します。

st99_d00_shp.zip ファイルを解凍し、st99_d00.shp シェープファイルと関連ファイル (st99_d00.shx および st99_d00.dbf) を入手してください。

データを PostGIS にインポートする

PostGIS には、(IBM® DB2® のように) ESRI シェープファイル形式のデータを直接データベースにインポートするためのユーティリティーが用意されていません。そのため、データを PostGIS にインポートするには以下の 2 つのステップを実行する必要があります。

  1. PostGIS が提供している shp2pgsql ツールを使用して、ESRI シェープファイルを SQL の適切な INSERT 文に変換することができます。このツールを使ってシェープファイルから SQL INSERT 文が含まれるファイルを作成するには、コマンド shp2pgsql st99_d00.shp testdb.state_bounds > statebounds.sql を使用してください。コマンドライン・オプションを指定しない場合、このコマンドは SRS ID にデフォルト値として -1 を設定します。この記事ではデータベースの機能を使用して座標を変換するのではなく、GeoTools を使用して逆に投影するため、この設定で問題ありません。
  2. データベースが起動したことを確認した上で、psql コマンドを実行してスクリプトを実行します。

デフォルトで shp2pgsql ツールが作成する SQL ファイルには、create table とこのテーブルにジオメトリーの列を追加するための文が含まれます。ツールがこのテーブルを作成しないようにするには、さまざまなコマンドライン・オプションを使用することができます (PostGIS のドキュメントについては、「参考文献」を参照してください)。

インポートを確認する

インポート・プロセスを確認するには、pgAdmin III のような管理ツールを使用することも、テーブルで SQL SELECT 文を実行することもできます。ジオメトリー列で AsText()AsBinary() などの PostGIS 関数を試してみて、インポートが正常に行われることを確認してください。


サンプル・アプリケーション

上記の作業でインポートしたデータから KML を作成するアプリケーションは、最終的に J2EE サーブレットになります。このサーブレットの実行内容は以下のとおりです。

  • FIPS (Federal Information Processing Standard: 連邦情報処理標準) ベースの州コードを入力として受け取る
  • データベースに対してクエリーを実行する
  • 座標変換を行う
  • データから KML を作成する

データについて

データベースにインポートされるデータには、ある特定の州の FIPS ベースの州コードに対して複数の行がある場合があります。これは、州が複数の隣接していない地域で構成されている場合もあるからです。その一例として、アラスカ州は多くの島々からなります。サンプル・アプリケーションを単純にするため、ここでは最大の面積を占める地域だけを選択します。

データベースに対してクエリーを実行してジオメトリーを読み込む

地理データは、WKB (Well Known Binary) 形式と WKT (Well Known Text) 形式の両方で表すことができます。PostGIS には、ジオメトリー列を WKB 形式または WKT 形式のデータにそれぞれ変換する AsBinary() 関数、AsText() 関数があります。データに対してクエリーを実行する SQL 文をリスト 1 に記載します。

リスト 1. 州の境界線データを WKB 形式で取得するクエリー
String stateBoundsSql = "SELECT AsBinary(the_geom), name FROM state_bounds WHERE 
   state = '"	+ stateCd + "' ORDER BY area DESC LIMIT 1";

GeoTools ライブラリーに付属の JTS (Java Topology Suite) には、WKB 形式のジオメトリーを、そのジオメトリーを表す Java オブジェクトに変換する WKBReader というクラスがあります。このクラスを使用して、州の境界線データを別の JTS クラス、MultiPolygon Java オブジェクトに変換します。リスト 2 はその一例です。

リスト 2. ジオメトリーを JTS Java オブジェクトに読み込む方法
WKBReader wkbRead = new WKBReader();
Geometry geom = wkbRead.read(resultSet.getBytes(1));
MultiPolygon multiPolygon = (MultiPolygon) geom;

座標変換

米国国勢調査局からインポートしたデータの形式は、NAD83 (North American Datum 1983) に基づく空間参照系です。空間参照系は地球の楕円体近似を使用しますが、OpenLayers、Google マップ、Microsoft® Bing といった Web ベースの地図作成用ライブラリーはすべて、WGS (World Geodetic System) データに基づきます。これらのライブラリーは Web ベースの地図にデータを表示する際に必要な計算を単純にするために、楕円体の地球ではなく、球体の地球を前提としています。したがって、データを変換してからでないと Web ベースの地図にオーバーレイすることができません。データの変換には、GeoTools ライブラリーが提供する変換関数を使用することができます (リスト 3 を参照)。

リスト 3. 変換オブジェクトの作成
String SOURCE_WKT = "GEOGCS[\"GCS_North_American_1983\",DATUM[\"D_North_American_1983\",
   SPHEROID[\"GRS_1980\",6378137.0,298.257222101]],PRIMEM[\"Greenwich\",0.0],UNIT[
   \"Degree\",0.0174532925199433]], AXIS[\"Latitude\",NORTH]]";

String TARGET_WKT = "GEOGCS[\"WGS 84\",DATUM[\"World Geodetic System 1984\",SPHEROID[
   \"WGS 84\", 6378137.0, 298.257223563, AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",
   \"6326\"]],PRIMEM[\"Greenwich\", 0.0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",
     0.017453292519943295],AXIS[\"Geodetic latitude\", NORTH],AXIS[\"Geodetic longitude\",
    EAST],AUTHORITY[\"EPSG\",\"4326\"]]";

CRSFactory crsFactory = FactoryFinder.getCRSFactory(null);
CoordinateReferenceSystem sourceCRS = crsFactory
					.createFromWKT(SOURCE_WKT);
CoordinateReferenceSystem targetCRS = crsFactory
					.createFromWKT(TARGET_WKT);
Hints hint = new Hints(Hints.LENIENT_DATUM_SHIFT, true);
CoordinateOperationFactory coFactory = FactoryFinder.getCoordinateOperationFactory(hint);
CoordinateOperation co = coFactory.createOperation(sourceCRS,targetCRS);
MathTransform transform = co.getMathTransform();

座標変換を行うオブジェクトを作成したら、一度に 1 つずつ座標のペアを渡して同じように変換します。リスト 4 に一例を記載します。

リスト 4. 座標の変換
Coordinate[] coordinates = multiPolygon.getCoordinates();
for (int i = 0; i < coordinates.length; i++) {
	Coordinate coordinate = coordinates[i];
	double x = coordinate.x;
	double y = coordinate.y;
	DirectPosition point = new GeneralDirectPosition(x, y);
	point = transform.transform(point, point);
	double lat = point.getOrdinate(0);
	double lng = point.getOrdinate(1);
..
}

KML を作成する

これで座標は変換できたので、後はこれらの座標を使用して KML 文書を作成するだけです (KML のドキュメントについては、「参考文献」を参照してください)。ポリゴン・データを表すための KML 文書のレイアウトは、以下のとおりです。

リスト 5. ポリゴン・データを表す KML の例
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
	<Document>
		<Placemark>
			<MultiGeometry>
				<Style>
					<PolyStyle>
						<color>66FF0000</color>
						<colorMode>normal</colorMode>
						<fill>1</fill>
						<outline>0</outline>
					</PolyStyle>
				</Style>
				<Polygon>
					<LinearRing>
						<coordinates>-109.045,36.99,0
							-109.0451,36.967,0
							-109.0452,36.968,0
							-109.0452,36.958,0
							-109.045,36.99,0
						</coordinates>
					</LinearRing>
				</Polygon>
			</MultiGeometry>
		</Placemark>
	</Document>
</kml>

この記事ではコードを至って単純にするため、XML パーサーや JAXB を使用して KML 文書を作成することはしません。リスト 6 に記載するように、ストリングを追加して KML を作成します。

リスト 6. KML 文書の作成
String kmlHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><kml
    xmlns=\"http://earth.google.com/kml/2.0\"><Document><Placemark><MultiGeometry>
<Style><PolyStyle>
   <color>66FF0000</color><colorMode>normal</colorMode><fill>1</fill>
<outline>0</outline></PolyStyle></Style><Polygon><LinearRing><coordinates>";
String kmlFooter = "</coordinates></LinearRing></Polygon></MultiGeometry></Placemark>
   </Document></kml>";
String kmlBody = "";
for (int i = 0; i < coordinates.length; i++) {
	..
	double lat = point.getOrdinate(0);
	double lng = point.getOrdinate(1);
	kmlBody += lng + "," + lat + "," + 0 + "\n";
}

KML を表示する

州の境界線を記述する KML 文書を提供するサービスは用意できました。次のステップは、このサービスを利用して境界線を地図上に表示する Web ページを作成することです。それには、OpenLayers を使用します。

リスト 7. KML サービスを利用して地図上に形状をオーバーレイするJavaScript
map.addLayer(new OpenLayers.Layer.GML("KML",
 "http://localhost:8080/OpenKML/StateKml?stateCd=04", 
   {
	format: OpenLayers.Format.KML, 
	formatOptions: {
	extractStyles: true, 
	extractAttributes: true,
	maxDepth: 2
   }
}));

以下の図 2 に、Metacarta による地図上に OpenLayers を使用して表示したアリゾナ州の KML オーバーレイを示します。

図 2. OpenLayers を使用した地図上の KML オーバーレイ
OpenLayers を使用した地図上の KML オーバーレイ

まとめ

マッシュアップによって、企業はあらゆる種類のデータが持つ潜在的な可能性を引き出すことができます。この記事を読み終えた今、皆さんはユーザーに、従来のアプリケーション開発にかかるコストのほんの一部で状況依存型アプリケーションを作成する機能を提供することができます。

ロケーション情報のマッシュアップと地図ベースのマッシュアップは、マッシュアップのなかでも人気の高いカテゴリーです。Web ベースの地図提供プロバイダーの出現により、今では地図をベースとしたマッシュアップを、ほとんど、あるいは一切の資本投資なしで簡単に作成することができます。この記事ではその一例として、オープンソースのソフトウェアを使用して、マッシュアップで使用可能な KML 境界線データ・サービスを ESRI シェープファイルから作成する方法について説明しました。


ダウンロード

内容ファイル名サイズ
Sample codeos-kmlservice-SourceFiles.zip11KB

参考文献

学ぶために

製品や技術を入手するために

  • PostGIS をダウンロードしてください。メジャー・リリースには、大幅な機能拡張が含まれています (オブジェクトのサポート、空間インデックス機能、地図サーバーのサポート、SRID サポート)。マイナー・リリースは、一般ユーザー・コミュニティーにバグ修正およびマイナーな機能拡張を提供します。
  • Apache Software Foundation から Apache Tomcat をダウンロードしてください。
  • 米国国勢調査局から州の ESRI シェープファイルを入手してください。
  • IBM ソフトウェアの試用版を使用して、次のオープンソース開発プロジェクトを革新してください。ダウンロード、あるいは DVD で入手できます。
  • IBM 製品の評価版をダウンロードするか、あるいは IBM SOA Sandbox のオンライン試用版で、DB2®、Lotus®、Rational®、Tivoli®、および WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=467959
ArticleTitle=地図ベースのオリジナル・マッシュアップを作成する
publish-date=01192010