2006年03月29日
ポリゴンの色分け
http://www.cs.sunysb.edu/~algorith/implement/trick/distrib/trick.c を参考にというかパクッて、MapServerでポリゴンデータの四色問題に挑戦してみました。
ポリゴンデータは、ESRIさんの全国市区町村界データH16年版を用いました、ありがとうございます。
![]()
拡大の地図
赤丸はポリゴンの中心点、ラインは枝。そしてなぜか5色(w
おおまかな作り方
- 隣接ポリゴンを抽出。
- 抽出した隣接ポリゴンからグラフデータを作成
- トップのプログラムを利用して色分けする。
かねてからアルプスさんの地図みたいに町丁目ごとに色を塗り替えたら見栄えがいい地図ができるのではと思っていたのですが、MapServer+PostGISででも結構簡単に出来そうですねー
ただ、飛び地などを考慮に入れてないので、利用できる場所は背景図などあまり精度を要求されていない場所に限定されると思われます(アルゴリズムは何度みても理解できません、知恵熱が...)。
暇ができたら、もうちょっとしっかりとしたドキュメントまとめるかも...(需要ありますか?)
投稿者 nishioka : 22:47 | コメント (0) | トラックバック
2006年03月25日
kamapも最近頑張ってる模様
MapServerのフレームワークというべきかインターフェースというべきか、わかりませんが、kamapで構築した良サイト発見!
英語圏のボートレースサイトのようですが、ここでボートレースの結果を地図上で公開するのにkamapを利用しています。
各レースの結果をkamapで結果を整理しているのですが、Google Mapsのようにグリグリと動かすだけでなく、レースに参加しているボートや海水の温度をレイヤーとしてON/OFFすることもできますし、ボートの動きを時間軸(アニメーションもあり)で追うことが出来てとて面白いと思います。
(ちょっとアニメーションタイマーが速いような気がしますが)
kamapは昨年半ばのリリース後からversionはなかなか上がっていませんがkamapも順調に伸びてるようです。
インターフェースだけなら、Google Mapsで可能ですが、海図といった特殊な地図リソースを用いたい、投影法を変えたい、複数のリソース切り替えたいという要望をかなえるためにはkamapやMapServerの出番になるのではないでしょうか?
これからも期待してチェックしたいと思います。
投稿者 nishioka : 22:57 | コメント (2) | トラックバック
2005年11月29日
Autodesk Embracing Open Source
Slashdot本家より
http://slashdot.org/article.pl?sid=05/11/28/1940207
Seba writes to tell us that Autodesk appears to be embracing open source with the recent donation of their web mapping technology to the open source community.
From the article: "A snapshot of the MapServer Enterprise source code is available today through the new MapServer Foundation, an independent non- profit organization with the mission of supporting and promoting open source web mapping.
The foundation's charter members include MapServer Technical Steering Committee members, the University of Minnesota MapServer Project, the DM Solutions Group, and Autodesk."
Autodesk がMapServerにコミットする模様。
忙しいのでちゃんと読んでないですが
MapServerML本家でかなり盛り上がっているみたいなので便乗ポスト。
投稿者 nishioka : 09:28 | コメント (4) | トラックバック
2005年11月20日
GeoIP Mapを改造
大分前にアクセスログからGeoIPをかましてアクセスの世界的な分布図を作りましたが、作りっぱなしで放置していました。
作った当初の目標として、月に一度くらいデータの更新する予定だったのですが、Blogのアクセスログを引っ張ってくるのとCronの設定やらが面倒で放置していたところ、さきほど始まったGoogle Analytics(これが無料で使えるのは凄い)の解析画面で表示される世界地図の分布図を見て、いちいちApacheのアクセスログを使わんでも、Google Analyticsのようにアクセスごとに情報を専用DBに流し込めば、アクセスログに毎回アクセスするよりもサーバに負荷もかからず(アクセスログ全部にGeoIPをかますと大変)に最新の分布図が出来ることに気付き、
早速DBに国データを保存して、動的に地図を分布図を作成してみました。
11/20日スタートなので日本とUSからしかアクセスが無くて寂しい分布図
投稿者 nishioka : 23:58 | コメント (0) | トラックバック
2005年07月26日
GeoIPの続き
前回のネタの続き。
GeolPはインストールできても、ShapelibやMapServerあたりのインストールはめんどくさいと言う、皆様のためにこんなものを用意しました。
世界白地図作成CGI
(自宅サーバなので、見えなかったらすんません)
使い方
- 下にある geoip.pyダウンロードして、Apacheのアクセスログの国別集計を作成する。
- 世界白地図作成CGIのテキストフォームに国別集計の結果を貼付ける(1カラム目:国ID;2カラム目:集計数;3カラム目:ランク;区切り文字はスペースまたはタブ)
- 作成するshape file名を指定する (排他処理していないのでユニークになりそうな名前にしてください
- "draw"ボタンをおす
- 世界地図が表示されます。コピーするなりなんなりどうぞ
- おまけで世界地図を表示するために作ったShape fileもダウンロードできます
※国別集計のフォーマットさえ判ればApacheのログ集計以外にも白地図描画用に使えそうなので、なにか面白いアイデアがあれを頂ければ機能を追加してみたいと思います。
geoip.py
#!/usr/local/bin/python
import GeoIP
import sys
import string
import math
import remaxRank = 5
ar = sys.argv[1:]
gi = GeoIP.new(GeoIP.GEOIP_MEMORY_CACHE)
ip = {}
p = re.compile('¥d+¥.¥d+¥.¥d+¥.¥d+')try:
f = open(ar[0])
for line in f.readlines():
line = line[:-1]
text = line.split(" ")
host = text[0]
m = p.match(host)
if m:
name = gi.country_name_by_addr(host)
else:
name = gi.country_code_by_name(host)
if ip.has_key(name):
ip[name] = ip[name] + 1
else:
ip[name] = 1
f.close()
except IOError:
print "Can't find file:", ar[0]max = len(ip)
ipv = ip.values()
ipv.sort()
lenip = {}
j = 0
for l in ipv:
lenip[l] = math.ceil((j * maxRank ) / max) +1
j = j + 1for k in ip.keys():
print k,'¥t',ip[k],'¥t',lenip[ip[k]]
投稿者 nishioka : 23:42 | コメント (0) | トラックバック
2005年07月23日
GeoIP + Shapelib + MapServerで国別の主題図
GeoIP(Python) + Shapelib(Python) + MapServerでApache logの国別の主題図を作ってみました.
nishioka.sakura.ne.jpにおける先月のApache logから国別の主題図
(自宅サーバなので、見えなかったらすんません)
Apache logから国別の主題図作り方のメモ
- http://www.diva-gis.org/data/DataServer.htmから世界地図をゲット
- apache logからIPアドレスのリストを作成してGeoIPで国別の集計をする
- ShapeLibを使って世界地図の属性に2で作成した集計情報を追加する
- MapServerで3.で作った世界地図を表示する
ShapelibとGeoIPはPythonのモジュールを利用しました。
僕の環境(FreeBSD)では、MapServerはPackageからGeoIPはPortsから取得して、そしてShapelibとpyShapelibはソースからコンパイルして利用しました。
コンパイルには特にオプションは設定していませんので割愛します。
2と3を行うPythonのコードをさらしておきます、
ip2dbf.py
#!/usr/local/bin/python import GeoIP import sys import string import math import dbflib import re ar = sys.argv[1:] gi = GeoIP.new(GeoIP.GEOIP_MEMORY_CACHE) ip = {} p = re.compile('¥d+¥.¥d+¥.¥d+¥.¥d+')try:
basedbf = ar[1]
except IndexError:
basedbf = "cntry00.dbf"
try:
savedbf = ar[2]
except IndexError:
savedbf = "new.dbf"try:
f = open(ar[0])
for line in f.readlines():
line = line[:-1]
text = line.split(" ")
host = text[0]
m = p.match(host)
if m:
name = gi.country_name_by_addr(host)
else:
name = gi.country_code_by_name(host)
if ip.has_key(name):
ip[name] = ip[name] + 1
else:
ip[name] = 1
f.close()
except IOError:
print "Can't find file:", xmax = len(ip)
ipv = ip.values()
ipv.sort()
lenip = {}
j = 0
for l in ipv:
lenip[l] = math.ceil((j * 5) / max) +1
j = j + 1
newdbf = dbflib.create(savedbf)
#for k in ip.keys():
# print k,'¥t',ip[k],'¥t',lenip[ip[k]]
try:
dbf = dbflib.open(basedbf,"rb+")
fieldcount = dbf.field_count()
for i in range(fieldcount):
field = dbf.field_info(i)
newdbf.add_field(field[1],field[0],field[2],field[3])
newdbf.add_field("count",dbflib.FTInteger,6,0)
newdbf.add_field("rank",dbflib.FTInteger,3,0)
dbfcount = dbf.record_count()
for i in range(dbfcount):
line = dbf.read_record(i)
na = line['ISO_2DIGIT']
line['count'] = ip.get(na,0)
line['rank'] = lenip.get(ip.get(na,0),0)
newdbf.write_record(i,line)
# print line , ' ', ip.get(na,0),' ',lenip.get(ip.get(na,0),0)
f.close()
except IOError:
print "Can't find file:", xdbf.close()
newdbf.close()
使い方
python ip2dbf.py access_log input.dbf output.dbf
引数 1 : アクセスログファイル
引数 2 : 世界地図のdbfファイル
引数 3 : 新しいdbfファイル
例
python ip2dbf.py access_log cntry00.dbf tmp.dbf
cp cntry00.dbf cntry00.db.bk
mv tmp.dbf cntry00.dbf
1.で取得した 世界地図のshape fileの属性データ" cntry00.dbf"とアクセスログをもとに新しい属性データ"tmp.dbf"を作ります
1.で取得した 世界地図のshape fileの属性データ" cntry00.dbf"のバックアップを取ります
新しい属性データ"tmp.dbf"を世界地図のshape fileの属性データとして利用するために" cntry00.dbf"にリネームします
説明
- このスクリプトは世界地図のDBFに主題図用のフィールドを追加します
- shapeの構造は*.shp(図形ファイル),*.dbf(属性ファイル),*.sbx(図形索引ファイル)にで構成されています、このスクリプトはdbf(属性ファイル)のみを加工します。そのため、このスクリプトで作成したdbfファイルをShape fileとしてMapServerなどで利用するためには、スクリプトにて作成したdbfファイルを元のファイル名にリネームしてください
- access_logは一レコード目にIPアドレスがあり、スペースで区切られている必要があります.
- IPアドレスでもホスト名でもOKです。
- 主題図用のフィールドとして、元のフィールドから"rank" と"count"をoutput.dbfを作成します
- "rank"フィールドはアクセス数が多い順に5段階、"count"フィールドは今までアクセスの総計が入ります
pythonのスクリプトやらmapfileとかを詰め合わせたセット
(世界地図も入れてますのでMapServerさえあれば動くと思います、再配布まずいかな?)
投稿者 nishioka : 22:01 | コメント (0) | トラックバック
2005年05月19日
ka-map
DM Solutionsからka-mapのテスト募集をしています。
さっそくデモサイトにいきましたが、なかなか凄いです。
Google Mapsに対する、オープンソースGISからの回答と行ったところですね、まだまだリリースは先かもしれませんが、期待大です。
とは言うもののさっそくダウンロードしようと思ったのですがCVSからとれません
どうすればいいのでしょうか?
bash-2.05a$ cvs checkout ka-map
cvs server: cannot find module `ka-map' - ignored
cvs [checkout aborted]: cannot expand modules
orz...
追記:
と悲しんでいたのですが、よく読む(先頭に書いてあったけど)とCSVの公開ももうちょっと先みたいですね。
追記2(2005/5/19):
ダウンロードできるようになりました。
投稿者 nishioka : 00:34 | コメント (0) | トラックバック
2005年05月17日
Orkney MapServer 4.6 新発売
オークニーさんのサイトのニュースでOrkney MapServer 4.6の予約が始まったとでてました。
前になったスタンダード版が無くなって、エンタープライズ版のみになっているようですが、新たにソラリスと、Windows版もサポートするようです。(Windows版は値段などが無いので詳しくは不明)
今回のバージョンは本家の4.6と機能的な違いはなさそうなのですし、エンタープライズ版のみなところから、MapServerを売っていくよりはSIerとしてMapServerを広めていくことでサポートをメインにしていくビジネス戦略なのでしょうか?
投稿者 nishioka : 12:27 | コメント (6) | トラックバック
2005年04月15日
MapServer SVG HOWTO
MapServerの次期バージョン(4.6)でSVGのサポートが始まりますが、開発バージョン(4.5)でも取り込みが進んでるみたいですね.
というわけでMapServer SVG HOWTOを見つけたのでご報告。
<?xml version="1.0" encoding="UTF-8"?> <svg version="1.1" width="400" height="300" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:au="http://www.svgmovile.jp/2004/kddip" au:boundingBox="0 0 400 300">......
<text x="210" y="279" font-family="fritqat" font-size="8pt" fill="#000000" stroke="#ffffff" stroke-width="0.5" >Toronto </text >
.......
</svg>
たんなるSVGとgoSVGが出力できるようで、上はgoSVGで出力したものを抜き出したものです。
実はSVGOpenに行ってgoSVGセッションを聞いていたくせにいまいち理解しておらずは座標系をサポートしているってことしか知らなかったのですが、上記のHOWTO内で出力されたSVGのサンプルを見るとトロントの位置がx="210" y="279"と表示位置範囲内の座標になっています。ということは、投影した座標をSVGの原点にあわせて図形を移動させているようですね。これは便利かも!?
※まだ動かしていないので推測を書いてます。
投稿者 nishioka : 18:04 | コメント (5) | トラックバック
2005年03月25日
TikiMap
TikiMapというWikiとMapServerを混ぜたものがある模様。
なかなか面白ですな。
最初はWikiと地図が連携するメリットがあまり思い浮かばなかったけど、Wikipediaみたいなものと相性が良さそうなのでなかなか期待できるかもしれませんね。
http://tikiwiki.org/tiki-map.phtml
http://tikiwiki.org/tiki-index.php?page=TikiMap
サモワ政府もTIKIWIKIを使っていました。
Samoa Map
投稿者 nishioka : 21:42 | コメント (4) | トラックバック
2005年02月16日
MapServerでimagemapがつくれた。
ちょっと調べごとがあってMapServerのソースをのぞいていたら
Map fileだけでクリッカブルマップが作れるんですね。色々使い道がありそうです。
history.txtをみてみたら4.0から対応していたらしいので
当たり前のことだと恥ずかしいなぁ。
http://vevo.verifiedvoting.org/verifier/
* OUTPUTFORMAT
* NAME imagemap
* DRIVER imagemap
* FORMATOPTION ""POLYHREF=/verifier/map.php?state=%s""
* FORMATOPTION ""SYMBOLHREF=#""
* FORMATOPTION ""SUPPRESS=YES""
* FORMATOPTION ""MAPNAME=map-48""
* FORMATOPTION ""POLYMOUSEOUT=return nd();""
* FORMATOPTION ""POLYMOUSEOVER=return overlib('%s');""
* END
投稿者 nishioka : 21:22 | コメント (0)