SQL ServerでOpenStreetMapを使用する

OpenStreetMapが若い、動的に開発されているプロジェクトであることは秘密ではありません。そこで、多くの有用な情報を見つけることができます。 この情報はすでに構造化されているため、少しの労力で、魂が望むことができるものすべてを抽出し、完全に除外することができます

この投稿の目的は、SQL Serverデータベースサーバーを使用してこの情報を保存および取得する方法を示すことです。 2008バージョン以降、幾何学的および地理的データタイプを保存および処理できます。 したがって、可能な限りこの目的に適しています。



まず、データベースサーバーが理解できる形式でデータをエクスポートする必要があります。 幸いなことに、自転車を発明する必要はありません。 OpenStreetMapは、ほとんどの最新のデータベースで理解できるXML形式へのエクスポートをサポートしていますが、OSMと誤解されているためです。

サンクトペテルブルク市のすべての銀行に関する情報を調べて処理したいとします。 これを行うには、プロジェクトに関する必要な情報を見つけて、「エクスポート」ボタンをクリックします。



画像



この場合、エクスポート形式「データ(OpenStreetMap XML)」を選択する必要があります

残念ながら、幸いなことに、選択した領域のオブジェクトの数が制限を超えている場合があります。 次に、 gis-lab.infoリソースから保存されたosmファイルが助けになります



必要に応じて、サンクトペテルブルクを選択し、必要なosmファイルをダウンロードします

これで、受信したデータをデータベースにロードできます。 覚えているように、SQL Serverでこれを行うつもりでしたが、SQL Server 2008R2を使用します。



最初に、受信したデータをxml型変数に変換します。



DECLARE @x xml;

SET @x = (SELECT * FROM OPENROWSET(

BULK 'C:\tmp\stpeter.osm',

SINGLE_BLOB) AS x);








次に、ノードのテーブル(ノード)とその説明(nodestag)を作成します

最初に、最初に:

IF object_id('nodes') IS NOT NULL

DROP TABLE nodes



CREATE TABLE nodes (

nodeid int,

latitude float,

longitude float,

geog4326 geography

);

INSERT INTO nodes

SELECT

OSMnode.value('@id', 'int') AS nodeid,

OSMnode.value('@lat', 'float') AS latitude,

OSMnode.value('@lon', 'float') AS longitude,

geography::Point(OSMnode.value('@lat', 'float'), OSMnode.value('@lon', 'float'), 4326) AS geog4326

FROM

@x.nodes('/osm/node') AS OSM(OSMnode)








SQL Server Management Studioでの結果データの表示方法は次のとおりです。



画像



各ノードは(オプションで)任意の数のタグを持つことができます。 XMLソースファイルでは、それらはそれぞれの子要素で表されます。



IF object_id('nodetags') IS NOT NULL

DROP TABLE nodetags

CREATE TABLE nodetags (

nodeid int,

tagname varchar(32),

tagvalue varchar(32)

);

INSERT INTO nodetags

SELECT

OSMNode.e.value('(@id)[1]', 'int') AS 'NodeID',

OSMNodeTag.e.value('@k', 'nvarchar(32)') AS 'TagName',

OSMNodeTag.e.value('@v', 'nvarchar(32)') AS 'TagValue'

FROM

@x.nodes('/osm/node') AS OSMNode(e)

CROSS APPLY

OSMNode.e.nodes('tag') AS OSMNodeTag(e)








さて、私たち全員がそれを始めたものを手に入れましょう:



SELECT

n.nodeid,

n.geog4326,

nt.TagValue

FROM nodes n

LEFT JOIN nodetags nt ON n.nodeid = nt.nodeid AND TagName in ('Name' ,'operator')

WHERE n.nodeid IN

(

SELECT nodeid from nodetags

where tagvalue like '%%'

)








受け取ったポイントがSSMSに表示される方法は次のとおりです。



画像



また、取得したデータは、たとえばBingカードに簡単に転送できます(Microsoft Report Builderを使用してこれを行いました)。



画像



gis-lab.infoのメンバーのみに感謝することができます。また、キエフに別のトレーニング場がないことを後悔しています。 ウクライナ全体のようなエンティティは、投げて回すのが非常に困難です...



All Articles