Skip to content
This repository was archived by the owner on Nov 14, 2025. It is now read-only.

Commit 6349d13

Browse files
committed
Added optional precision to Entity.loc()
1 parent 9130ef2 commit 6349d13

6 files changed

Lines changed: 22 additions & 9 deletions

File tree

contrib/examples/smartdatamodels/offstreet_parking/offstreet_parking.generated.jsonld

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@
7676
"value": {
7777
"type": "Point",
7878
"coordinates": [
79-
-8.609612,
80-
41.150692
79+
-8.60961198807,
80+
41.150691773
8181
]
8282
}
8383
},

contrib/examples/smartdatamodels/offstreet_parking/offstreet_parking.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
e.prop("extCategory", ["A"])
1616
e.prop("fourWheelerSlots", {"availableSpotNumber": 25, "totalSpotNumber": 25, "occupiedSpotNumber": 0})
1717
e.prop("layout", ["multiLevel"])
18-
e.loc(41.150691773, -8.60961198807)
18+
e.loc(41.150691773, -8.60961198807, precision=11)
1919
e.prop("maximumParkingDuration", "PT8H")
2020
e.prop(
2121
"municipalityInfo",

src/ngsildclient/model/attr/geo.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ def value(self):
3232
return geojson.loads(str(self["value"]))
3333

3434
@value.setter
35-
def value(self, v: Union[Tuple, Geometry]):
35+
def value(self, v: Union[Tuple, Geometry], precision: int = 6):
3636
if self["type"] != "GeoProperty":
3737
raise ValueError("Attribute type MUST be GeoProperty")
3838
if isinstance(v, Tuple) and len(v) == 2:
3939
lat, lon = v
40-
v = Point((lon, lat))
40+
v = Point((lon, lat), precision=precision)
4141
self["value"] = v
4242

4343
@property

src/ngsildclient/model/entity.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -465,16 +465,17 @@ def gprop(
465465
nested: bool = False,
466466
datasetid: str = None,
467467
observedat: Union[str, datetime] = None,
468+
precision: int = 6,
468469
) -> Entity:
469-
property = NgsiDict.mkgprop(value, datasetid=datasetid, observedat=observedat)
470+
property = NgsiDict.mkgprop(value, datasetid=datasetid, observedat=observedat, precision=precision)
470471
self._update_entity(name, property, nested)
471472
return self
472473

473-
def loc(self, *coord, **kwargs) -> Entity:
474+
def loc(self, *coord, precision: int = 6, **kwargs) -> Entity:
474475
if len(coord) == 1 and isinstance(coord, Tuple):
475476
coord = coord[0]
476477
if len(coord) == 2:
477-
return self.gprop("location", coord, **kwargs)
478+
return self.gprop("location", coord, precision=precision, **kwargs)
478479
raise ValueError("lat,lon tuple expected")
479480

480481
""" A helper method to set the frequently used "location" geoproperty.

src/ngsildclient/model/ngsidict.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,13 +187,14 @@ def mkgprop(
187187
datasetid: str = None,
188188
observedat: Union[str, datetime] = None,
189189
attrname: str = None,
190+
precision: int = 6,
190191
) -> AttrGeoValue:
191192
from ngsildclient.model.attr.geo import AttrGeoValue
192193

193194
if isinstance(value, Tuple):
194195
if len(value) == 2:
195196
lat, lon = value
196-
value = Point((lon, lat))
197+
value = Point((lon, lat), precision=precision)
197198
else:
198199
raise ValueError("lat, lon tuple expected")
199200
attrvalue = AttrValue(value, datasetid, observedat)

tests/test_entity.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,17 @@ def test_loc_2_float():
5454
}
5555

5656

57+
def test_loc_high_precision():
58+
e = Entity("OffStreetParking", "porto-ParkingLot-23889")
59+
e.loc(41.150691773, -8.60961198807, precision=11) # default precision is 6 (geojson default)
60+
assert e.to_dict() == {
61+
"id": "urn:ngsi-ld:OffStreetParking:porto-ParkingLot-23889",
62+
"type": "OffStreetParking",
63+
"@context": ["https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context.jsonld"],
64+
"location": {"type": "GeoProperty", "value": {"coordinates": [-8.60961198807, 41.150691773], "type": "Point"}},
65+
}
66+
67+
5768
def test_constructor_type_and_id_fully_qualified():
5869
e = Entity("AirQualityObserved", "urn:ngsi-ld:AirQualityObserved:RZ:Obsv4567")
5970
assert e.type == "AirQualityObserved"

0 commit comments

Comments
 (0)