وبلاگ شخصی آقای استثنایی

تبدیل داده های OSM به سه گانه های RDF

mahdi | 06 July, 2017 08:17

RDF اولین زبان وب معنایی است که یک چهارچوب برای توصیف منابع را فراهم می­کند. این زبان خانواده ای از توصیفات W3C است که به عنوان یک مدل داده­ ای فراداده طراحی شده است. داده های منتشر شده توسط OSM به صورت XML است. XML از نظر سطح انتزاع پایین تر از RDF است و راه ­های نحوی مختلفی برای نمایش یک جمله RDF در آن وجود دارد. بنابراین بر حسب نحوه نمایش، شیوه ارائه پرس و جو نیز متفاوت است. هرچند در حال حاضر استاندارد خاصی برای نمایش داده­های OSM در قالب XML وجود دارد اما چنانچه در آینده تغییراتی روی آن صورت گیرد، پرس و جو های طراحی شده بر روی آن دیگر قابل استفاده نخواهد بود. برای استخراج اطلاعات مورد نظر از زبان پرس و جوی  SPARQL بر روی داده­های RDF استفاده می­شود. در زیر نمونه ای از داده های OSM در قالب XML آورده شده است.
 

<node id="260124290" visible="true" version="6" changeset="6603724" timestamp="2010-12-10T10:29:20Z" user="kesler" uid="13908" lat="36.3225001" lon="59.5178539">

  <tag k="bench" v="yes"/>

  <tag k="bus" v="yes"/>

  <tag k="name" v="ایستگاه سید رضی"/>

  <tag k="public_transport" v="stop_position"/>

  <tag k="shelter" v="yes"/>

 </node>

<way id="23989292" visible="true" version="8" changeset="11928655" timestamp="2012-06-17T18:05:43Z" user="Claudius Henrichs" uid="18069">

  <nd ref="260096368"/>

  <nd ref="260096382"/>

  <nd ref="260096383"/>

  <nd ref="260096384"/>

  <nd ref="689360930"/>

  <tag k="highway" v="residential"/>

  <tag k="name" v="هنرستان ۱۹"/>

 </way>

<relation id="27278" visible="true" version="2" changeset="47136036" timestamp="2017-03-24T22:02:12Z" user="sebastic" uid="665748">

  <member type="way" ref="23992168" role="outer"/>

  <member type="way" ref="25415406" role="inner"/>

  <tag k="natural" v="water"/>

  <tag k="type" v="multipolygon"/>

 </relation>

کد تبدیل داده های OSM به سه گانه های RDF به زبان #C

 

Normal 0 false false false EN-US X-NONE AR-SA

            string prefix = "PREFIX wtlab: <http://wtlab.um.ac.ir/osm#> \nPREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> \nPREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n";

 

            System.IO.StreamWriter fp = new System.IO.StreamWriter("map.ttl");

            fp.WriteLine(prefix);

 

            foreach (XElement nodeElement in XElement.Load("map.xml").Elements("node"))

            {

                

                fp.WriteLine("wtlab:"+nodeElement.Attribute("id").Value+" rdf:type"+" wtlab:Node.");

                fp.WriteLine("wtlab:" + nodeElement.Attribute("id").Value + " geo:lat " + nodeElement.Attribute("lat").Value+".");

                fp.WriteLine("wtlab:" + nodeElement.Attribute("id").Value + " geo:long " + nodeElement.Attribute("lon").Value + ".");

 

                foreach (XElement tagElement in nodeElement.Elements("tag"))

                {

                    fp.Write("wtlab:" + nodeElement.Attribute("id").Value);

                    fp.WriteLine(" wtlab:" + tagElement.Attribute("k").Value + " \"" + tagElement.Attribute("v").Value+"\".");

                }

             }

 

 

 

            foreach (XElement wayElement in XElement.Load("map.xml").Elements("way"))

            {

 

                fp.WriteLine("wtlab:" + wayElement.Attribute("id").Value + " rdf:type" + " wtlab:Way.");

                foreach (XElement tagElement in wayElement.Elements("tag"))

                {

                    fp.Write("wtlab:" + wayElement.Attribute("id").Value);

                    fp.WriteLine(" wtlab:" + tagElement.Attribute("k").Value + " \"" + tagElement.Attribute("v").Value + "\".");

                }

                foreach (XElement refElement in wayElement.Elements("nd"))

                {

                    fp.Write("wtlab:" + wayElement.Attribute("id").Value);

                    fp.WriteLine(" wtlab:hasNode" + " wtlab:"+refElement.Attribute("ref").Value + ".");

                }

 

            }

 

 

            foreach (XElement relationElement in XElement.Load("map.xml").Elements("relation"))

            {

 

                fp.WriteLine("wtlab:" + relationElement.Attribute("id").Value + " rdf:type" + " wtlab:Relation.");

                foreach (XElement memberElement in relationElement.Elements("member"))

                {

                    fp.Write("wtlab:" + relationElement.Attribute("id").Value);

                    if(memberElement.Attribute("type").Value == "node")

                        fp.WriteLine(" wtlab:hasNode wtlab:" + memberElement.Attribute("ref").Value + ".");

 

                    if (memberElement.Attribute("type").Value == "way")

                        fp.WriteLine(" wtlab:hasWay wtlab:" + memberElement.Attribute("ref").Value + ".");

 

                    if (memberElement.Attribute("type").Value == "relation")

                        fp.WriteLine(" wtlab:hasRelation wtlab:" + memberElement.Attribute("ref").Value + ".");

 

                }

                foreach (XElement tagElement in relationElement.Elements("tag"))

                {

 

                    fp.Write("wtlab:" + relationElement.Attribute("id").Value);

                    fp.WriteLine(" wtlab:" + tagElement.Attribute("k").Value + " \"" + tagElement.Attribute("v").Value + "\".");

 

                }

            }

 

            fp.Close();

        }

Normal 0 false false false EN-US X-NONE AR-SA

نمونه ای از نتیجه

 

 

Normal 0 false false false EN-US X-NONE AR-SA

PREFIX wtlab: <http:// wtlab.um.ac.ir/osm#>

PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

 

wtlab:260124290 rdf:type wtlab:Node.

wtlab:260124290 geo:lat 36.3225001.

wtlab:260124290 geo:long 59.5178539.

wtlab:260124290 wtlab:bench "yes".

wtlab:260124290 wtlab:bus "yes".

wtlab:260124290 wtlab:name "ایستگاه سید رضی".

wtlab:260124290 wtlab:public_transport "stop_position".

wtlab:260124290 wtlab:shelter "yes".

 

wtlab:23989292 rdf:type wtlab:Way.

wtlab:23989292 wtlab:highway "residential".

wtlab:23989292 wtlab:name "هنرستان ۱۹".

wtlab:23989292 wtlab:hasNode wtlab:260096368.

wtlab:23989292 wtlab:hasNode wtlab:260096382.

wtlab:23989292 wtlab:hasNode wtlab:260096383.

wtlab:23989292 wtlab:hasNode wtlab:260096384.

wtlab:23989292 wtlab:hasNode wtlab:689360930.

 

wtlab:27278 rdf:type wtlab:Relation.

wtlab:27278 wtlab:hasWay wtlab:23992168.

wtlab:27278 wtlab:hasWay wtlab:25415406.

wtlab:27278 wtlab:natural "water".

wtlab:27278 wtlab:type "multipolygon".

 

Normal 0 false false false EN-US X-NONE AR-SA

مدل داده ای open street map

mahdi | 06 July, 2017 08:10

مدل داده ­های OSM بسیار ساده است. این داده ها از سه نوع پایه با نام­ ­های  node، way و relation تشکیل شده­ اند. هرکدام از آنها با یک شناسه عددی یکتا متمایز می­ شوند. nodeها بیانگرنقاط روی زمین بوده و دارای طول و عرض جغرافیایی هستند. از آنها برای نمایش عوارض جغرافیایی بدون اندازه و قابل توجه مانند قله کوه­ ها استفاده می­شود. wayها لیست­های ترتیبی از nodeها هستند که خطوط چندگانه یا چند ضلعی­ها را ( در صورتیکه بسته باشند) نمایش می­دهند. از آنها برای نمایش عوارض خطی زمین مانند خیابان­ ها، رودخانه­ ها و نواحی مانند جنگل­ ها، دریاچه­ ها و پارکینگ­ ها استفاده می­ شود. relationها لیست­های ترتیبی از nodeها، wayها و relationها هستند که در مجموع member نامیده می­شوند. هر member می­تواند یک role داشته باشد که اختیاری  بوده و کارکرد یک member را مشخص می­ کند. از relationها برای بیان ارتباطات منطقی یا جغرافیایی بین nodeها و wayها استفاده می­ شود. tagها جفت کلید و مقدار بوده که هردو رشته­ ای هستند. از tagها برای ذخیره سازی فراداده (مانند نوع، نام و غیره) برای اشیاء روی نقشه استفاده می­ شود. tagها به تنهایی بکار نمی­روند بلکه به nodeها، wayها و relationها مرتبط هستند. مقادیر tagها آزاد است به همین دلیل تنوع آنها بسیار زیاد است. همچنین ممکن است دارای اشتباهات تایپی و املائی ناشی از بی دقتی کاربران باشند. یک هستان نگار پیشنهادی برای آنها در wiki وجود دارد و پیشنهاد می­شود کاربران از مجموعه لغات این هستان­ن گار استفاده کنند تا به نوعی همسان سازی صورت گرفته باشد. آدرس آن در زیر آمده است.

https://wiki.openstreetmap.org/wiki/Map_Features

حاشیه  نویسی صورت گرفته توسط tagها، فراهم کننده یک منبع غنی و متنوع از اطلاعات در مورد عناصر OSM است. به عنوان مثال از آنها برای تمایز قائل شدن بین انواع جاده ­ها و یا مشخص کردن نقاط جالب و قابل توجه استفاده می ­شود. Normal 0 false false false EN-US X-NONE AR-SA

Open Street Map

mahdi | 06 July, 2017 08:08

پروژه OSM یک پروژه گروهی برای ایجاد یک نقشه قابل ویرایش از جهان است. همچنین یک منبع غنی از داده ­های مکانی است که به صورت رایگان در اختیار همگان است. این نقشه بوسیله داده­ های حاصل از دستگاه­ های GPS، عکس­ های فضایی و دیگر منابع ایجاد می­شود. انجمن OSM مجموعه­ ای از ابزارهای ویرایشی طراحی کرده است. کاربران می­توانند به کمک این ابزارها رد عملیات GPS را بارگذاری کرده و داده­ های برداری را ویرایش کنند. تصاویر ایجاد شده به همراه مجموعه داده­ های برداری در اختیار کاربران بوده و قابل دریافت است. در واقع ایده OSM از Wiki گرفته شده است. کیفیت و حجم داده ها در نقاط مختلف جهان بر حسب تعداد کاربران و فعالیت آنها متفاوت است. با این حال تعداد کاربران و حجم داده ها با سرعت زیادی در حال افزایش است. Normal 0 false false false EN-US X-NONE AR-SA

نمونه پرس و جو ها در GeoSPARQL

mahdi | 28 June, 2017 20:00

در این بخش نمونه پرس و جو ها به همراه توضیح آنها در SPARQL آورده شده است.
SELECT ?wkt
WHERE {
            ex:Monument1  geo:hasGeometry ?g.
             ?g geo:asWKT ?wkt.
           }
مختصات نمونه Monument1 نمایش داده می شود.
SELECT ?f
WHERE {
             ?f geo:hasGeometry ?g.
             ?g  geo:asWKT ?gWKT.
             FILTER ( geof:sfWithin(?gWKT,
                         "POLYGON((-77.2 38.8, -77 38.8, -77 39, -77.2 39.9, -77.2 38.8 ) )"^^sf:wktLiteral))
}
مکان هایی را که در داخل چندضلعی مشخص شده قرار گرفته را استخراج می کند.
 
SELECT ?f
WHERE {
              ex: Park1 geo:hasGeometry ?g1.
              ?f a ex:Monument;
                     geo:hasGeometry ?g2.
              ?g2 geo:sfWithin ?g1.
}
  بناهای یادبودی را که در داخل نمونه Park1 قرار دارد را استخراج می کند.

اتصال یک هستان نگار به GeoSPARQL

mahdi | 28 June, 2017 19:19

اتصال یک هستان نگار به GeoSPARQL

برای اتصال یک هستان نگار به GeoSPARQL کلاس های مربوط به مکان ها را به عنوان زیر کلاس geo:Feature معرفی می کنیم. به این ترتیب نمونه های این کلاس ها می توانند توسط ویژگی geo:hasGeometry به یک geo:Geometry متصل شوند. در Geometry ویژگی های مکانی آن مکان ثبت می شود.

ex:Monument a owl:class;

rdfs:SubClassOf   geo:Feature.

ex:Monument1 a ex:Monument;

rdfs:label "Washington Monument";

geo:hasGeometry ex: Point1.

ex: Point1 a geo: Point;

geo:asWKT "POINT(-77.9887 38.9876)"^^geo-sf:WktLiteral.

 

  در مثال فوق Monument1 نمونه ای از کلاس Monument معرفی شده و از آنجاییکه Monument زیر کلاس Feature است می تواند دارای ویژگی hasGeometry باشد. این ویژگی با Point1 مقدار گرفته که مختصات آن مشخص شده است. Normal 0 false false false EN-US X-NONE AR-SA

GeoSPARQL

mahdi | 28 June, 2017 12:01

GeoSPARQL

یکی از زبان های پرکاربرد برای پرس و جو بر روی داده های RDF زبان SPARQL می باشد. این زبان برای پرس و جوهایی مناسب است که ارتباط بین داده ها به صراحت بیان شده باشد. از جمله پرس و جوهای مهم، پرس و جوهای مکانی است که در آن می خواهیم به سوالاتی در مورد روابط مکان های مختلف پاسخ دهیم. اما ارتباطات مکانی بین اشیاء عموما ضمنی است. مثلا فرض کنید پایگاه داده ای شامل پارک ها و بناهای یادبود است. اطلاعات مختلفی از جمله اطلاعات جغرافیایی (مثلا طول و عرض جغرافیایی) این مکان ها وجود دارد. می خواهیم بدانیم چه پارک هایی تا شعاع 3 کیلومتری بنای یاد بود واشنگتون هستند؟ برای آنکه امکان پاسخ دادن به چنین سوالاتی فراهم شود نیاز به پردازش های خاصی بر روی داده ها داریم که SPARQL  قادر به پاسخ دادن به آنها نیست.

GeoSPARQL استانداردی است که توسط OGS (Open Geospatial Consortium) ارائه شده است. در این استاندارد داده های مکانی به فرم RDF توصیق شده اند و امکان پرس و جو و فیلترینگ بر روی روابط بین نهادهای مکانی وجود دارد. پیاده سازی کاملی از GeoSPARQL وجود ندارد. چندین پیاده سازی آن شامل موارد زیر است:

Apache Marmotta و Parliament و Strabon و GraphDB و Stardog

GeoSparql یک مجموعه واژگان برای ارائه داده های مکانی در RDF تعریف می کند. همچنین یک توسعه بر روی زبان پرس و جوی  SPARQL برای پردازش داده های مکانی می باشد.

در هستان نگار GeoSparql سه کلاس مهم وجود دارد که در ادامه توضیح داده شده است.

geo : Feature : هر چیزی مانند پارک و بنای یادبود که دارای موقعیت مکانی باشد.

geo : Geometry : ارائه یک موقعیت مکانی مانند یک نقطه تا مشخص کردن مرز یک Feature را بیان می کند.

Geo : SpatialObject : که ابر کلاس Feature و Geometry می باشد.

 

ویژگی geo : hasGeometry ارتباط بین چیز (Feature) را با موقعیت مکانی آن (Geometry) برقرار می کند.

منابع Geometry به فرم لیترال های RDF ارائه می شوند. ویژگی geo:asWKT یک منبع Geometry را به wktLiteral متصل می کند. لیترال مورد نظر اطلاعات واقعی Geometry را در بر دارد. چهار نوع اصلی Geometry شامل موارد زیر است:

POINT     sf: Point  POINT(long1 lat1)

LINESTRING     sf:LineString  LINESTRING(long1 lat1 , long2 lat2 , ... )

POLYGON   sf: Polygon   POLYGON((long1 lat1 , long2 lat2 , ... long1 lat1))

POLYGON (with Hole ) sf: POLYGON((long1 lat1, long2 lat2, ... , long1 lat1) ,(longA latA, longB latB , ... , longA latA))

همان طور که مشاهده می کنید مختصات اول و آخر چند ضلعی ها یکی است تا یک شکل بسته را تشکیل دهند.

برای تبدیل WKT های فوق به لیترال های RDF از و نوع داده geo-sf : WktLiteral استفاده می کنیم. نمونه ای از آن در ادامه آورده شده است.

 

"POINT(-77.8765 38.7654"^^geo-sf:WktLiteral

 


که یک نقطه با مختصات مورد نظر را توصیف می کند.

 

 

Normal 0 false false false EN-US X-NONE AR-SA

خوش آمدید!

mahdi | 24 June, 2017 08:42

خواندن این مطلب به این معنی است که مراحل ثبت نام با موفقیت به پایان رسیده و شما می توانید شروع به کار با وبلاگ نمائید
 
Accessible and Valid XHTML 1.0 Strict and CSS
Converted to use with ITS. Powered by FUMblog