A platial modelling library for representing human experience of place
Project description
The Platial Modelling Operating System
"Place is not a location."
Chora is the first Python library designed to model the human experience of place. It moves beyond standard GIS (geometry + coordinates) to simulate how places emerge from memory, habit, and social interaction.
✨ Why Chora?
Standard tools ask: "What is at Lat/Lon 51.5, -0.1?" Chora asks: "Why does this park feel like 'Home' to Alice, but 'Danger' to Bob?"
| 🧠 Cognitive | 🕰 Temporal | 🕸 Relational |
|---|---|---|
| Models Familiarity & Memory decay over time. | Places emerge and dissolve dynamically. |
A "Place" is a graph of Encounters, not a polygon. |
🛠 Features
- Experiential Physics: Built-in decay functions (
linear,exponential) simulate how memories fade without reinforcement. - Emergent Places: "Place" is not stored; it is computed on-the-fly from the history of interaction.
- Practice Detection: Algorithms to detect Routines, Habits, and Rituals from GPS traces.
- H3 Spatial Indexing: Hexagonal grids for multi-resolution place analysis.
- Vibe Search: Vector embeddings for semantic place similarity.
- LLM Integration: Generate place narratives with OpenAI/Anthropic/Ollama.
- Real-time Streaming: Process live GPS traces with dwell detection.
- Graph Native: Built on Property Graphs, exportable to Neo4j and D3.js.
⚡ Quick Start
Installation
pip install chora-geo
The "Hello Place" API
from chora.core import PlatialGraph, Agent, SpatialExtent, Encounter, PlatialEdge
from chora.derive import update_familiarity
# 1. Create the world
graph = PlatialGraph("My World")
alice = Agent.individual("Alice")
park = SpatialExtent.from_point(-0.1, 51.5, name="Hyde Park")
# 2. Add to the graph
graph.add_node(alice)
graph.add_node(park)
# 3. Alice visits the park (An Encounter)
visit = Encounter(agent_id=alice.id, extent_id=park.id)
graph.add_node(visit)
graph.add_edge(PlatialEdge.participates_in(alice.id, visit.id))
# 4. Derive Familiarity
fam = update_familiarity(graph, visit)
print(f"Alice's familiarity with Park: {fam.value:.2f}")
# -> "Alice's familiarity with Park: 0.15"
🔍 Vibe Search
Find places by semantic description:
from chora.search import vibe_search
results = vibe_search(graph, "quiet peaceful park for reading")
# Returns: [(park, 0.87), (garden, 0.72), ...]
📚 Documentation
| Guide | Description |
|---|---|
| GPS to Places | Process traces into meaningful places |
| Affective Mapping | Map emotions to locations |
| Detecting Routines | Find habits & patterns |
| Visualization | D3.js graphs & reports |
| H3 Indexing | Hexagonal spatial analysis |
🔮 Roadmap
| Version | Status | Features |
|---|---|---|
| v0.5 | ✅ | Core, Tests, CI/CD, Docs |
| v0.9 | ✅ | CLI, Notebooks, Visualization |
| v1.0 | ✅ | H3, Embeddings, LLM, Streaming |
| v2.0 | 🚧 | Social Physics, Digital Twins |
🤝 Contributing
We welcome contributions from Geographers, Developers, and Philosophers. See CONTRIBUTING.md to join the project.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file chora_geo-0.1.0.tar.gz.
File metadata
- Download URL: chora_geo-0.1.0.tar.gz
- Upload date:
- Size: 308.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d874320b3d06c51a922ad96c5f7b891ab7662b8a21ef7c9f7d51ec554abdc52e
|
|
| MD5 |
cfd6aaaad7eae74a12d035425f6078d3
|
|
| BLAKE2b-256 |
e1133c2bb12330f79058fb86d7f06f3d9b9366c08617a36439d2244de0ce4955
|
Provenance
The following attestation bundles were made for chora_geo-0.1.0.tar.gz:
Publisher:
release.yml on jwilliamsresearch/chora
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chora_geo-0.1.0.tar.gz -
Subject digest:
d874320b3d06c51a922ad96c5f7b891ab7662b8a21ef7c9f7d51ec554abdc52e - Sigstore transparency entry: 906638432
- Sigstore integration time:
-
Permalink:
jwilliamsresearch/chora@47267cb66ce3b95069488f6b09872b0435415d0c -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/jwilliamsresearch
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@47267cb66ce3b95069488f6b09872b0435415d0c -
Trigger Event:
release
-
Statement type:
File details
Details for the file chora_geo-0.1.0-py3-none-any.whl.
File metadata
- Download URL: chora_geo-0.1.0-py3-none-any.whl
- Upload date:
- Size: 98.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
27348d4156bec9cf58c27e4f1c3f111da1efbb476d21a6c2e0b8a673d046e679
|
|
| MD5 |
0dcbe96e293090a1b6cac821d798591d
|
|
| BLAKE2b-256 |
59028c7d10725e3b351d995c86dd34d3b7bcfeac324b164aac6baba827e95d8b
|
Provenance
The following attestation bundles were made for chora_geo-0.1.0-py3-none-any.whl:
Publisher:
release.yml on jwilliamsresearch/chora
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chora_geo-0.1.0-py3-none-any.whl -
Subject digest:
27348d4156bec9cf58c27e4f1c3f111da1efbb476d21a6c2e0b8a673d046e679 - Sigstore transparency entry: 906638477
- Sigstore integration time:
-
Permalink:
jwilliamsresearch/chora@47267cb66ce3b95069488f6b09872b0435415d0c -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/jwilliamsresearch
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@47267cb66ce3b95069488f6b09872b0435415d0c -
Trigger Event:
release
-
Statement type: