#1 Sat 09 January 2010 18:17
- feraudyh
- Participant actif
- Date d'inscription: 13 May 2009
- Messages: 103
Imprécision de la fonction Perimeter
Je crée une région carrée de côté 3 mètres (ou c'est ce que je croyais)
La fonction MapBasic Perimeter me calcule son périmètre comme
12.009
C'est un peu grossier, non?
Bon je peux écrire ma propre routine, mais maintenant je perds ma confiance en ObjectLen par exemple...
Au fait je commence par
set coordsys NonEarth Units "m" Bounds(0, 0) (500,500)
Note ajouté plus tard:
En fait: ce sont les coordonnées des sommets de mes polygones d'entrée qui ont été modifiées par MapInfo.
Les coordonnées du rectangle avait été rentré avec des valeurs entieres, et pourtant...
(voir le message ci dessous)
Dernière modification par feraudyh (Sat 09 January 2010 20:32)
Hors ligne
#2 Sat 09 January 2010 19:29
- feraudyh
- Participant actif
- Date d'inscription: 13 May 2009
- Messages: 103
Re: Imprécision de la fonction Perimeter
Je viens d'afficher mes données. Curieusement les coordonnées des sommets de ma région sont légèrement décalés par rapport à ce que j'avais rentré.
Une affaire de système de coordonnées?
Voici le code pour les données en entrée
Code:
include "mapbasic.def" declare sub main declare sub addbuilding(ByVal pref as string, ByVal x1 as float, ByVal y1 as float,ByVal xwidth as float,ByVal ydepth as float, ByVal zheight as float,ByVal utype as string) sub main set coordsys NonEarth Units "m" Bounds(0, 0) (30, 30) Create Table Building (parcel_ref char(40),areaperfloor float,height float, X_Center float,Y_Center float, type char(8), aux float) Create Map for Building call addBuilding("A",1,6, 3, 3, 42, "prive") call addBuilding("B",1,11, 3, 3, 36, "prive") call addBuilding("C",16, 6, 4,3, 27,"public") call addBuilding("D",20, 7, 10, 1, 30,"prive") Commit table Building end sub 'batiments rectangulaires sub addBuilding(ByVal pref as string, ByVal x1 as float, ByVal y1 as float, ByVal xwidth as float, ByVal ydepth as float, ByVal zheight as float,ByVal utype as string) Dim x2 as float, y2 as float, x3 as float, y3 as float, x4 as float, y4 as float dim regionObj as Object dim area_per_floor , center_x, center_y as float x2 = x1+xWidth x3=x2 y2=y1 y3= y1+ydepth x4=x1 y4=y3 create Region into variable regionObj 1 4 (x1,y1)(x2,y2)(x3,y3)(x4,y4) area_per_floor = Area( regionObj, "sq m" ) insert into Building (Obj, parcel_ref,areaperfloor,height,X_Center,Y_Center, type, aux) values (regionObj, pref, area_per_floor, zheight, CentroidX(regionObj), CentroidY(regionObj), utype,0) end sub
Dernière modification par feraudyh (Sat 09 January 2010 21:14)
Hors ligne
#3 Mon 11 January 2010 16:13
- Patrick PALMIER
- Participant actif
- Lieu: Lille
- Date d'inscription: 18 Jan 2007
- Messages: 97
Re: Imprécision de la fonction Perimeter
Bonjour,
le problème pourrait bien être un problème de système de coordonnées
Le code coordsys définit la projection de calcul de mapbasic (non Earth avec des bounds 0,30 0,30) OK
mais lorsque vous créez la table vous devez également indiquer la projection de la table
Essayer plutôt
Create Map for Building Coordsys NonEarth Units "m" Bounds(0, 0) (30, 30)
Il faut repréciser le coordsys (non earth ....) pour forcer l projection de la table buildings dans votre système de projection, sinon il la crée dans la système par défaut, qui ne doit certainement pas être du non terrestre avec avec de tels paramètres d'étendue, d'où l'arrondi des coordonnées.
Dernière modification par Patrick PALMIER (Mon 11 January 2010 16:14)
Hors ligne
#4 Mon 11 January 2010 17:52
- feraudyh
- Participant actif
- Date d'inscription: 13 May 2009
- Messages: 103
Re: Imprécision de la fonction Perimeter
Merci beaucoup, comme je suis un débutant en SIG ces histoires de coordonées ne sont pas évidents!
Hors ligne