{"id":44346441,"url":"https://github.com/ammaryasser455/geoqa","last_synced_at":"2026-02-17T20:00:46.230Z","repository":{"id":337741708,"uuid":"1155005031","full_name":"AmmarYasser455/geoqa","owner":"AmmarYasser455","description":"GeoQA: Geospatial Data Quality Assessment . one-liner profiling, quality scoring, interactive reports","archived":false,"fork":false,"pushed_at":"2026-02-12T19:35:42.000Z","size":6021,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-12T21:51:23.416Z","etag":null,"topics":["data-quality-checks","geopandas","geopython","geospatial","gis","interactive-mapping","profiling","python","quality-assessment","quality-control","shapely","vector-data"],"latest_commit_sha":null,"homepage":"https://ammaryasser455.github.io/geoqa/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AmmarYasser455.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-11T02:35:35.000Z","updated_at":"2026-02-12T19:35:45.000Z","dependencies_parsed_at":null,"dependency_job_id":"c75f5a76-f595-41a3-b153-89bc9983e704","html_url":"https://github.com/AmmarYasser455/geoqa","commit_stats":null,"previous_names":["ammaryasser455/geoqa"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/AmmarYasser455/geoqa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AmmarYasser455%2Fgeoqa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AmmarYasser455%2Fgeoqa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AmmarYasser455%2Fgeoqa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AmmarYasser455%2Fgeoqa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AmmarYasser455","download_url":"https://codeload.github.com/AmmarYasser455/geoqa/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AmmarYasser455%2Fgeoqa/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29411845,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-13T06:24:03.484Z","status":"ssl_error","status_checked_at":"2026-02-13T06:23:12.830Z","response_time":78,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-quality-checks","geopandas","geopython","geospatial","gis","interactive-mapping","profiling","python","quality-assessment","quality-control","shapely","vector-data"],"created_at":"2026-02-11T14:03:50.629Z","updated_at":"2026-02-13T16:01:25.767Z","avatar_url":"https://github.com/AmmarYasser455.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/AmmarYasser455/geoqa/main/docs/geoqa_logo.png\" alt=\"GeoQA Logo\" width=\"200\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eGeoQA\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eGeospatial Data Quality Assessment \u0026 Interactive Profiling\u003c/strong\u003e\u003cbr\u003e\n  \u003cem\u003eProfile any geodataset with a single line of code\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://pypi.org/project/geoqa/\"\u003e\u003cimg src=\"https://img.shields.io/pypi/v/geoqa?style=flat-square\u0026color=blue\" alt=\"PyPI\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://pypi.org/project/geoqa/\"\u003e\u003cimg src=\"https://img.shields.io/pypi/pyversions/geoqa?style=flat-square\" alt=\"Python\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://opensource.org/licenses/MIT\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-green?style=flat-square\" alt=\"License\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/AmmarYasser455/geoqa/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/AmmarYasser455/geoqa/ci.yml?style=flat-square\u0026label=CI\" alt=\"CI\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## What is GeoQA?\n\n**GeoQA** is a Python package for **automated quality assessment and interactive profiling** of geospatial vector data. Think of it as [ydata-profiling](https://github.com/ydataai/ydata-profiling) (formerly pandas-profiling) but purpose-built for geodata.\n\n- **Profile** any vector dataset (Shapefile, GeoJSON, GeoPackage, etc.) with one line of code\n- **Validate** geometry quality — invalid, empty, duplicate, and mixed-type detection\n- **Analyze** attribute completeness, statistics, and distributions\n- **Visualize** data on interactive maps with quality-issue highlighting\n- **Generate** self-contained HTML quality reports with charts and tables\n- **Automate** QA/QC workflows via CLI or Python API\n\n## Key Features\n\n| Feature | Description |\n|---|---|\n| **One-liner profiling** | `geoqa.profile(\"data.shp\")` — instant dataset overview |\n| **Geometry validation** | OGC-compliant validity checks, empty/null detection, duplicate finding |\n| **Attribute profiling** | Data types, null analysis, unique values, descriptive statistics |\n| **Interactive maps** | Folium-based maps with issue highlighting and quality coloring |\n| **HTML reports** | Self-contained quality reports with charts and tables |\n| **CLI interface** | `geoqa profile data.shp` — terminal access to all features |\n| **Auto-fix** | Repair invalid geometries with `profile.geometry_results` |\n| **Spatial analysis** | CRS info, extent, area/length statistics, centroid computation |\n\n## Installation\n\n```bash\npip install geoqa\n```\n\n**From source (development):**\n\n```bash\ngit clone https://github.com/AmmarYasser455/geoqa.git\ncd geoqa\npip install -e \".[dev]\"\n```\n\n**Requirements:** Python 3.9+ — depends on geopandas, shapely, folium, matplotlib, pandas, numpy, jinja2, click, and rich.\n\n## Quick Start\n\n### Python API\n\n```python\nimport geoqa\n\n# Profile a dataset\nprofile = geoqa.profile(\"buildings.shp\")\n\n# View summary\nprofile.summary()\n\n# Interactive map with issue highlighting\nprofile.show_map()\n\n# Quality check details\nprofile.quality_checks()\n\n# Generate HTML report\nprofile.to_html(\"quality_report.html\")\n\n# Attribute and geometry statistics\nprofile.attribute_stats()\nprofile.geometry_stats()\n```\n\n### From a GeoDataFrame\n\n```python\nimport geopandas as gpd\nimport geoqa\n\ngdf = gpd.read_file(\"roads.geojson\")\nprofile = geoqa.profile(gdf, name=\"City Roads\")\nprofile.summary()\n```\n\n### CLI\n\n```bash\ngeoqa profile data.shp                        # Profile a dataset\ngeoqa report data.shp --output report.html     # Generate HTML report\ngeoqa check data.geojson                       # Run quality checks only\ngeoqa show data.gpkg --output map.html         # Open interactive map\n```\n\n## Quality Score\n\nGeoQA computes an overall quality score (0–100) based on:\n\n| Component | Weight | Description |\n|---|---|---|\n| Geometry Validity | 40% | Percentage of valid geometries (OGC compliance) |\n| Attribute Completeness | 30% | Percentage of non-null attribute values |\n| CRS Defined | 15% | Whether a coordinate reference system is set |\n| No Empty Geometries | 15% | Percentage of non-empty geometries |\n\n## Quality Checks\n\n| Check | Severity | Description |\n|---|---|---|\n| Geometry Validity | High | OGC Simple Features compliance |\n| Empty Geometries | Medium | Geometries with no coordinates |\n| Duplicate Geometries | Medium | Identical geometry pairs (WKB comparison) |\n| CRS Defined | High | Coordinate reference system presence |\n| Attribute Completeness | Varies | Null/missing value analysis |\n| Mixed Geometry Types | Low | Multiple geometry types in one layer |\n\n## Interactive Visualization\n\nGeoQA creates interactive Folium maps with auto-reprojection to WGS84, quality highlighting (invalid in red, valid in blue), interactive tooltips, multiple basemaps, and layer controls.\n\n```python\nprofile.show_map()\n\n# Or use the visualization API directly\nfrom geoqa.visualization import MapVisualizer\nviz = MapVisualizer(profile.gdf, name=\"My Data\")\nquality_map = viz.create_quality_map(profile.geometry_results)\n```\n\n## HTML Reports\n\nGenerate comprehensive, self-contained HTML reports:\n\n```python\nprofile.to_html(\"report.html\")\n```\n\nReports include quality score badges, dataset overview cards, quality check tables with pass/fail/warn indicators, spatial extent information, attribute completeness bars, numeric column statistics, and geometry type distributions.\n\n## Supported Formats\n\nAll vector formats readable by GeoPandas/Fiona: Shapefile, GeoJSON, GeoPackage, KML, GML, CSV with geometry, File Geodatabase, and more via GDAL/OGR drivers.\n\n## Architecture\n\n```\ngeoqa/\n├── core.py           # GeoProfile — main entry point\n├── geometry.py       # Geometry validation \u0026 quality checks\n├── attributes.py     # Attribute profiling \u0026 statistics\n├── spatial.py        # CRS, extent, area/length analysis\n├── visualization.py  # Folium-based interactive maps\n├── report.py         # HTML report generation (Jinja2)\n├── charts.py         # Matplotlib chart generation\n├── cli.py            # Click-based CLI interface\n└── utils.py          # Utility functions\n```\n\n## Contributing\n\nContributions are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n```bash\ngit clone https://github.com/AmmarYasser455/geoqa.git\ncd geoqa\npip install -e \".[dev]\"\npytest\nblack geoqa/ tests/\n```\n\n## License\n\n[MIT License](LICENSE)\n\n## Acknowledgments\n\nGeoQA is inspired by the development methodology and open-source philosophy of [Dr. Qiusheng Wu](https://github.com/giswqs) and the [opengeos](https://github.com/opengeos) community. Key inspirations include [leafmap](https://github.com/opengeos/leafmap), [geemap](https://github.com/gee-community/geemap), and [ydata-profiling](https://github.com/ydataai/ydata-profiling).\n\n## Citation\n\n```bibtex\n@software{geoqa2026,\n  title   = {GeoQA: A Python Package for Geospatial Data Quality Assessment},\n  year    = {2026},\n  url     = {https://github.com/AmmarYasser455/geoqa},\n  license = {MIT}\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fammaryasser455%2Fgeoqa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fammaryasser455%2Fgeoqa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fammaryasser455%2Fgeoqa/lists"}