Skip to content

Commit 23d451d

Browse files
committed
added polygon/geometry search
1 parent e8c58ba commit 23d451d

5 files changed

Lines changed: 401 additions & 2 deletions

File tree

logs/service-err.log

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4758,3 +4758,44 @@ Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsA
47584758
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
47594759
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
47604760
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4761+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4762+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4763+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4764+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4765+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4766+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4767+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4768+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4769+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4770+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4771+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4772+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4773+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4774+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4775+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4776+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4777+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4778+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4779+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4780+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4781+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4782+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4783+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4784+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4785+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4786+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4787+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4788+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4789+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4790+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4791+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4792+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4793+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4794+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4795+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4796+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4797+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4798+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4799+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4800+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'
4801+
Unable to create process using '"C:\Users\jamez\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe" -m uvicorn server:app --host 0.0.0.0 --port 8000'

service/api/address.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,42 @@ def get_address_coordinates(address_string: str, out_sr: int = 7856) -> Address
130130
surface_level_ahd = surface_level_ahd,
131131
)
132132

133+
134+
def get_address_suggestions(address_string: str, limit: int = 10) -> list[str] | None:
135+
"""
136+
Returns a list of matching addresses from NSW API using LIKE query.
137+
138+
Used for address suggestion/autocomplete — user types partial address,
139+
this returns candidates for the user to pick from.
140+
141+
Example: "14 Dellview Street Tamarama" might return:
142+
- "14-16 DELLVIEW STREET TAMARAMA"
143+
- "14 DELLVIEW STREET TAMARAMA"
144+
"""
145+
from service.utils import sanitise_address
146+
147+
normalised = sanitise_address(address_string)
148+
149+
params = {
150+
"where": f"address LIKE '%{normalised}%'",
151+
"outFields": "address",
152+
"returnGeometry": False,
153+
"resultRecordCount": limit,
154+
"f": "json"
155+
}
156+
157+
try:
158+
response = requests.get(ADDR_URL, params=params)
159+
data = response.json()
160+
features = data.get("features", [])
161+
162+
if not features:
163+
return None
164+
165+
# Extract unique addresses
166+
addresses = list(set(f["attributes"]["address"] for f in features))
167+
return sorted(addresses)
168+
169+
except Exception as e:
170+
print(f"[address] Error querying suggestions for '{address_string}': {e}")
171+
return None

service/api/lot.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import requests
2+
import json
23
from service.config import BASE
34
from service.models import Lot
45

@@ -127,6 +128,87 @@ def get_lot_info(x: float, y: float, epsg: int, distance: int = 200) -> list[Lot
127128
return results
128129

129130

131+
def get_lots_within_polygon(
132+
rings: list[list[list[float]]],
133+
epsg: int,
134+
) -> list[Lot]:
135+
"""
136+
Returns all cadastral lots that intersect the given polygon.
137+
138+
Args:
139+
rings: Coordinate rings in [[x, y], ...] format, already in `epsg`.
140+
First ring is the exterior; subsequent rings are holes.
141+
epsg: EPSG code of the input coordinates (must be a projected MGA zone).
142+
"""
143+
geometry_json = json.dumps({
144+
"rings": rings,
145+
"spatialReference": {"wkid": epsg},
146+
})
147+
148+
all_features = []
149+
offset = 0
150+
151+
while True:
152+
params = {
153+
"geometry": geometry_json,
154+
"geometryType": "esriGeometryPolygon",
155+
"spatialRel": "esriSpatialRelIntersects",
156+
"inSR": str(epsg),
157+
"outSR": str(epsg),
158+
"outFields": "*",
159+
"returnGeometry": True,
160+
"resultOffset": offset,
161+
"resultRecordCount": 100,
162+
"f": "json",
163+
}
164+
165+
response = requests.get(LOT_URL, params=params)
166+
data = response.json()
167+
168+
features = data.get("features", [])
169+
all_features.extend(features)
170+
171+
if not data.get("exceededTransferLimit", False):
172+
break
173+
174+
offset += len(features)
175+
176+
results = []
177+
for feature in all_features:
178+
attrs = feature.get("attributes", {})
179+
rings_raw = feature.get("geometry", {}).get("rings", [])
180+
if not rings_raw:
181+
continue
182+
183+
its_title_status_raw = attrs.get("itstitlestatus")
184+
stratum_level_raw = attrs.get("stratumlevel")
185+
has_stratum_raw = attrs.get("hasstratum")
186+
187+
results.append(Lot(
188+
lot_number = attrs.get("lotnumber") or "",
189+
plan_label = attrs.get("planlabel") or "",
190+
section_number = attrs.get("sectionnumber") or "",
191+
plan_number = attrs.get("plannumber"),
192+
plan_oid = attrs.get("planoid"),
193+
its_lot_id = attrs.get("itslotid"),
194+
cad_id = attrs.get("cadid"),
195+
controlling_authority_oid = attrs.get("controllingauthorityoid"),
196+
classsubtype = attrs.get("classsubtype"),
197+
its_title_status = its_title_status_raw,
198+
its_title_status_label = ITS_TITLE_STATUS.get(its_title_status_raw),
199+
stratum_level = stratum_level_raw,
200+
stratum_level_label = STRATUM_LEVEL.get(stratum_level_raw),
201+
has_stratum = (HAS_STRATUM.get(has_stratum_raw) == "True") if has_stratum_raw is not None else None,
202+
plan_lot_area = attrs.get("planlotarea"),
203+
plan_lot_area_units = attrs.get("planlotareaunits"),
204+
create_date = attrs.get("createdate"),
205+
modified_date = attrs.get("modifieddate"),
206+
geometry = _parse_geometry(rings_raw),
207+
))
208+
209+
return results
210+
211+
130212
def get_lot_by_folio(folio: str) -> Lot | None:
131213
"""
132214
Query a lot by folio reference (lot/section/plan).

0 commit comments

Comments
 (0)