MapBasic brugergruppe Geografiske objekter Slå mute fra hvis I vil sige eller spørge om noget Peter Horsbøll Møller Senior Systems Engineer April 2013
Program MapBasic IDE som udviklingsværktøj Geografiske objekter i tabeller Object-variabel Alias-variabel Læse og skrive geografiske fra/til en tabel Koordinatsystem Læse information fra et geografisk objekt Beregne værdier fra objekter Geografiske operatorer Oprette geografiske objekter Oprette afledte geografiske objekter Forskel, fælles og forening Ændre et eksisterende objekt Finde skæringspunkter Spørgsmål og svar
MapBasic IDE Hent den her: http://mustafaozcetin.wordpress.com/mapbasic/mapbasicide-en/ Et gratis udviklingsmiljø til MapBasic som dog kræver MapInfo MapBasic for at få kompileret kildekoden til en applikation Udviklet af en tredjepart, Mustafa Özçetin En væsentlig forbedring i forhold til standard MapBasic editoren Et alternativ til andre tredjeparts teksteditorer, som kan konfigureres til MapBasic udvikling En ny v1.4 RC1 er nu tilgængelig via ovenstående link
Geografiske objekter i tabeller Geografiske objekter i tabeller gemmes i OBJ-kolonnen Du skal altså referere til OBJ-kolonnen, når du vil læse eller skrive de geografiske objekter fra/til en tabel På disken gemmes disse i.map-filen, som kobles sammen med de alfanumeriske data via.id-filen
Object-variabel En object-variabel kan referere til et geografisk objekt af en vilkårlig type Object-variable er som udgangspunkt ikke initialiseret og skal derfor tildeles en værdi før du refererer til dem. Dim opolyline As Object **Åh åh, her begår vi en fejl **Objektet er endnu ikke tildelt en værdi!! **Runtime fejl ikke fejl ifm. kompilering!! If ObjectInfo(oPolyline, OBJ_INFO_TYPE) = OBJ_TYPE_PLINE Then End if
Object-variabel En object-variabel består af flere information end blot geografien Udover geografien består den også af en stil Object-variabel x, y [x, y ] [...] Stil Den geografiske del kan man få fat på med en række geografiske funktioner - ObjectGeography(), ObjectNodeX/-Y og ObjectInfo() - og stilen kan man få fat på med funktionen ObjectInfo()
Alias-variabel En Alias-variabel peger på en kolonne i en tabel. Den anvendes f.eks. til at læse værdier fra en tabel, hvor tabel- og/eller kolonnnavnet er gemt i en streng-variabel. Det er altså ikke hårdtkodet i programmet Værdien for Alias-variabel sættes til kombinationen af et tabelnavn og et kolonnenavn: Rene variable tabel- og kolonnenavne acolumn = table_name &. & column_name Variabel kolonnenavn, hårdtkodet tabelnavn acolumn = TABELNAME. & column_name Variabel tabelnavn, hårdtkodet kolonnenavn acolumn = table_name &.KOLONNENAVN
Alias-variabel Dim aobj As Alias, opolyline As Object aobj = Selection.OBJ Fetch First From Selection If aobj Then opolyline = aobj End if
Læse geografiske objekter fra en tabel Brug som udgangspunkt en alias-variabel aobj = Selection.OBJ Kontroller om posten/posterne har geografiske objekter, enten i det du refererer den specifikke post If aobj Then End if opolyline = aobj eller via en forespørgsel, som udelukke poster uden geografi Select * From MIN_TABEL Where OBJ Into MIN_TABEL_GEO NoSelect Bruger du sidstnævnte metode kan du udelade Alias-variablen opolyline = MIN_TABEL_GEO.OBJ
Skrive geografiske objekter til en tabel Afhængig af behov skal du bruge enten Insert eller Update kommandoerne, som vi så på sidste gang. Insert indsætter nye poster: Insert Into MIN_TABEL (OBJ) Values (opolyline) Update opdaterer eksisterende poster: Update MIN_TABEL Set OBJ = opolyline Where ROWID = nrowid Husk enten at opdatere selection (en enkelt post) eller bruge Where begrænsningen, så du ikke opdaterer alle poster i din tabel med samme objekt!!
Koordinatsystem Husk altid at angive et koordinatsystem inden du læser koordinater fra et geografisk objekt eller sætter koordinater på et geografisk objekt Gør du ikke dette, kan du næsten være sikker på at ende et forkert sted i verden Brug kommandoen: Set CoordSys... Refererer eventuelt til en eksisterende åben tabel eller et kortvindue.
Eksempler Tabellen MIN_TABEL, som selvfølgelig er kortlægningsklar!! Set CoordSys Table MIN_TABEL Det aktive (kort)vindue Set CoordSys Window FrontWindow() UTM Zone 32 ETRS89 Set CoordSys Earth Projection 8, 115, 7, 9.0, 0, 0.9996, 500000, 0
Læse information fra et geografisk objekt Som tidligere nævnt kan du bruge en række funktioner til at læse information fra et geografiske objekt, herunder: ObjectInfo(): Generel information om objektets type, stil og bestanddele ObjectGeography (): De geografiske bestanddel, så som centroid, koordinatafgrænsning, koordinater fra linjer mm. ObjectNodeX()/-Y(): Koordinater fra de enkelte knuder i polylinjer og regioner CentroidX()/-Y(): Centroid-koordinater for objektet MBR(): Objektets mindste omskrevne firkant
Eksempel: Er første eller sidst knude nærmest? fshortestdistance = 1000000 'meters For nsegment = 1 To ObjectInfo(oExisting, OBJ_INFO_NPOLYGONS) For i = 1 To 2 If i = 1 Then nnode = 1 Else End If nnode = ObjectInfo(oExisting, OBJ_INFO_NPOLYGONS + nsegment) fdistance = Distance(fX, fy, ObjectNodeX(oExisting, nsegment, nnode), ObjectNodeY(oExisting, nsegment, nnode), "m") If fdistance < fshortestdistance Then fshortestdistance = fdistance nsegmentnearest = nsegment nnodenearest = nnode End If Next 'i Next 'nsegment
Beregne værdier fra objekter Der findes også en række funktioner til at afgøre størrelser på geografiske objekter, så som: Area(), Cartesian-(), Spherical-(): Objects areal Perimeter(), Cartesian-(), Spherical-(): Objektets omkreds ObjectLen(), Cartesian-(), Spherical-(): Objektets længde Distance(), Cartesian-(), Spherical-(): Afstand mellem to koordinatsæt
Geografiske operatorer De geografiske operatorer, som man måske kender fra MapInfo Professionals SQL valg, kan også anvendes på geografiske variable Intersects Within, Partly Within, Entirely Within Contains, Contains Part, Contains Entire Man kan bruge disse til at afgøre om to objekter interagerer geografisk If opolyline1 Intersects opolyline2 Then De berører hinanden Else De berører ikke hinanden End if
Oprette geografiske objekter MapBasic-sproget indeholder en lang række funktioner og kommandoer til at oprette geografiske objekter: CreateCircle( ) CreateLine( ) CreatePoint( ) CreateText( ) Create Arc Create Ellipse Create Frame Create Line Create Object Create Pline Create Point Create Rect Create Region Create RoundRect Create Text Create Multipoint Create Collection
Eksempler oline = CreateLine(fX1, fy1, fx2, fy2) Create Line Into Variable oline (fx1, fy1) (fx2, fy2) Pen CurrentLinePen() Create Pline Into Variable opline 3 (fx1, fy1) (fx2, fy2) (fx3, fy3) Create Region Into Variable opline 4 (fx1, fy1) (fx2, fy2) (fx3, fy3) (fx1, fy1) Pen CurrentBorderPen() Brush CurrentBrush()
Oprette afledte geografiske objekter Man kan også oprette geografiske objekter, som tager udgangspunkt i eksisterende geografiske objekter. Her er nogle eksempler: Buffer(), Cartesian-(), Sperical-(): Opret en buffer omkring et objekt MBR(): Opretter den mindste omskrevne firkant omkring et objekt Centroid(): Henter centroiden fra et objekt Offset(), Cartesian-(), Sperical-(): Forskyder et objekt x enheder i en retning OffsetXY(), Cartesian-(), Sperical-(): Forskyder et objekt i XY ConvexHull(): Laver et ConvexHull (elastik) objekt omkring knuder i et objekt ExtractNodes(): kan bruges til at trække delelementer ud af polylinjer og polygoner
Forskel, fælles og forening Man kan også beregne forskels-, fælles- og foreningsobjektet ud fra to inputobjekter: Forskel: Erase( source_object, eraser_object ) Fælles: Overlap( object1, object2 ) Forening: Combine( object1, object2 ) Bemærk at for Erase() har paramternes rækkefølge væsentlig betydning for resultatet
Ændre et eksisterende objekt Man kan med kommandoen Alter Object ændre et objekt på en lang række punkter, herunder objektets stil, knudepunkter og/eller centroid Syntax Alter Object object_variable { Info object_info_code, new_info_value Geography object_geo_code, new_geo_value Node } { Add [ Position polygon_num, node_num ] ( x, y ) Set Position polygon_num, node_num ( x, y ) Remove Position polygon_num, node_num } Med Info og Geography kan man sætte de værdier man kan læse med ObjectInfo() og ObjectGeography() Med Node kan man tilføje, ændre og slette knudepunkter
Eksempel: Tilføje og slette et knudepunkt -------------------- Alter Object oexisting Node Add Position nsegmentnearest, nnodenearest ( fx, fy ) Update Selection Set OBJ = oexisting -------------------- Alter Object oexisting Node Remove Position nsegment, nnode Update Selection Set OBJ = oexisting
Finde skæringspunkter MapBasic har også nogle funktioner, som kan hjælpe med at identificere hvor/hvorledes to objekter skærer hinanden Syntax IntersectNodes( object1, object2, points_to_include ) object1 and object2 are object expressions; may not be point or text objects. points_to_include is one of the following SmallInt values: INCL_CROSSINGS returns points where segments cross. INCL_COMMON returns end-points of segments that overlap. INCL_ALL returns points where segments cross and points where segments overlap.
MapBasic Udviklerdag Afholdes d. 26. juni 2013 kl. 10 16 i DGI-byen i København lige op og ned ad Hovedbanegården Vi efterlyser: Ønsker til indlæg? Ønsker til workshops? Indlægsholdere? Giver gratis deltagelse! Gode ideer og forslag til at gøre det til en udbytterig dag for jer?
Spørgsmål? Peter Horsbøll Møller peter.moller@pb.com www.pitneybowes.dk/software Husk: Som medlemmer af MapBasic brugergruppen har I mulighed for at sende spørgsmål til mig via e-mail
Links Den danske PBSoftware blog: PBBI Location Intelligence Blog: danmark.pbbiblogs.com li.pbbiblogs.com/ MapInfo-L groups.google.com/group/mapinfo-l MI Pro træningssvideoer: Planer for produkterne: Download MapBasic: MI Pro prøveversion: www.pbinsight.com/support/training/video-tutorials roadmap.pbinsight.com/ www.pbinsight.com/support/product-downloads/for/mapbasic www.pbinsight.com/support/product-downloads/for/mapinfo-professional MI Pro dokumentation: Anden dokumentation: Anden download: www.pbinsight.com/support/product-documentation/details/mapinfo-professional www.pbinsight.com/support/product-documentation/ www.pbinsight.com/support/product-downloads/