Pitney Bowes

Den danske PB Software blog

Hvordan kan man sammenligne geografiske objekter i MapBasic

by Peter Horsbøll Møller | 4. October 2012 | Ingen kommentarer

Som en kort opfølgning på artiklen om Hvordan kan man sammenligne geografiske objekter i MapInfo Professional, er her et eksempel på hvorledes man kan gøre det samme via en funktion, man selv skriver i MapBasic.

Fordelen ved at gøre det via et MapBasic-program er at man kan lade funktionen håndtere de forskellige objekttyper.

Til min function GetSpatialFingerprintSperical overfører jeg et geografisk objekt – det kunne eventuelt være direkte fra OBJ-kolonnen. I funktionen tester jeg som det første hvilke type objekt, der er tale om og behandler derefter hver objekttype særskilt. Til sidst returnerer jeg det “beregnede” geografiske fingeraftryk.


Do Case ObjectInfo(oInput, OBJ_INFO_TYPE)
Case OBJ_TYPE_POINT
...
Case OBJ_TYPE_LINE
...
Case OBJ_TYPE_PLINE
...
Case OBJ_TYPE_REGION
...
End Case

GetSpatialFingerprintSperical = sFingerprint

For hver objekttype udtrækker jeg de ønskede geografiske værdier fra objektet og sammensætter disse til et færdigt geografiske fingeraftryk for objektet, her er eksemplet for polylinjer:

nSegments = ObjectInfo(oInput, OBJ_INFO_NPOLYGONS)
sFingerprint = GetFingerPrintFromMeasurement(CartesianObjectLen(oInput, "m"))
+ "#" + nSegments
+ "#" + ObjectInfo(oInput, OBJ_INFO_NPNTS)
+ "#" + GetFingerPrintFromOrdinat(CentroidX(oInput))
+ "#" + GetFingerPrintFromOrdinat(CentroidY(oInput))
+ "#" + GetFingerPrintFromOrdinat(ObjectNodeX(oInput, 1, 1))
+ "#" + GetFingerPrintFromOrdinat(ObjectNodeY(oInput, 1, 1))
+ "#" + GetFingerPrintFromOrdinat(ObjectNodeX(oInput, nSegments, ObjectInfo(oInput, OBJ_INFO_NPOLYGONS + nSegments)))
+ "#" + GetFingerPrintFromOrdinat(ObjectNodeY(oInput, nSegments, ObjectInfo(oInput, OBJ_INFO_NPOLYGONS + nSegments)))

Bemærk at jeg for afrunding af værdierne kalder specifikke funktioner, som laver afrundingen. Dermed har jeg selve afrunding et enkelt sted i koden og kan nemt ændre denne til at anvender flere eller færre værdier.

Selve funktionen kalder/anvender jeg direkte i min SQL-forespørgsel i Main proceduren

Dim sTab1, sTab2 As String,
aObj1, aObj2 As Alias,
aID1, aID2 As Alias
sTab1 = "Lokalplaner_2011"
sTab2 = "Lokalplaner"
aID1 = sTab1 & ".PLANID"
aID2 = sTab2 & ".PLANID"
aObj1 = sTab1 & ".OBJ"
aObj2 = sTab2 & ".OBJ"

Set Coordsys Table sTab1
Select aID1
From sTab1, sTab2
Where aID1 = aID2
AND not GetSpatialFingerprintSperical(aObj1) = GetSpatialFingerprintSperical(aObj2)
Into CHANGED__OBJECTS NoSelect
Browse * From CHANGED__OBJECTS

Hent selve kildekoden til eksemplet her: SpatialFingerprint.zip.
Husk at ændre navne på tabeller og koloner med ID, inden du kører programmet.

Peter

Please observe our community guidelines when posting comments.

This blog is hosted by Pitney Bowes Inc. By using this blog you agree that you are solely responsible for any comment you post to the Blog and you agree to abide and be bound by the Pitney Bowes TERMS OF USE.

Please stay on topic. We may redirect certain submissions if they are better handled through another channel such as customer service. With regard to the content of any submissions you make through this Blog, you agree to remain solely responsible and agree to not submit materials that are unlawful, defamatory, abusive or obscene. You also agree that you will not submit anything to this Blog that violates any right of a third party, including copyright, trademark, privacy or other personal or proprietary rights.

Pitney Bowes reserves the right to terminate your ability to use and/or submit posts to this Blog. Pitney Bowes may not review all postings and is not responsible for comments posted on this Blog. Pitney Bowes nevertheless retains the right to not post, edit a posting or to remove any postings in its sole and absolute discretion.