Download the PHP package ifsnop/martinez-rueda-php without Composer

On this page you can find all versions of the php package ifsnop/martinez-rueda-php. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package martinez-rueda-php

Martinez Rueda PHP

Robust and tested library for boolean operations on polygons (union, intersection, difference, xor) in PHP.

Some improvements over other libraries: This one is tested (see end-to-end directory) and optimized to use polygons with large amount of vertex (ie, binary search when doing intersections between segments).

This library can use arrays with polygons, geojson strings or geojson files directly.

Índice

  1. Arquitectura general
  2. Clases principales
  3. Flujo de procesamiento
  4. API pública
  5. Ejemplos de uso
  6. Optimizaciones implementadas
  7. Mejoras sugeridas
  8. Profilig
  9. Testing A. Tutorials and Notes

Arquitectura general

La librería implementa un pipeline de tres fases para las operaciones booleanas:


Clases principales

Algorithm (final)

Clase estática central. Contiene toda la lógica de alto nivel y las operaciones públicas.

Constante / Método Descripción
TOLERANCE = 1e-12 Épsilon para comparaciones geométricas. Equivale aprox. a 1 mm en coordenadas terrestres.
TOLERANCE_SQRT = 1e-6 Raíz de TOLERANCE, para comparaciones de valores ya elevados al cuadrado.
segments(Polygon) Fase 1: convierte un polígono a PolySegments.
combine(PolySegments, PolySegments) Fase 2: combina dos conjuntos de segmentos.
polygon(PolySegments) Fase 3: reconstruye un Polygon desde segmentos.
union / intersect / difference / xor Operaciones de alto nivel sobre dos Polygon.
unionMany(array) Unión de N polígonos mediante reducción balanceada.
segmentChainer(array) Ensambla segmentos sueltos en anillos cerrados.
splitSelfTouchingRegions(array) Divide anillos que se auto-tocan en ciclos simples.

Polygon (final)

Representa un polígono como una lista de regiones (anillos), donde cada región es un array de objetos Point.

PolySegments (final)

Contenedor intermedio entre fases. Almacena segmentos, flag isInverted y el bounding box precalculado (bounds).

Segment (final)

Un segmento orientado entre dos Point. Contiene:

Point (final)

Coordenada 2D con métodos estáticos de geometría:

Método Descripción
compare(p1, p2) Orden lexicográfico con tolerancia epsilon.
collinear(p1, p2, p3) Test de colinealidad por área del triángulo.
linesIntersect(a0, a1, b0, b1) Intersección de dos líneas; devuelve IntersectionPoint con flags alongA/alongB (-2,-1,0,1,2).
between(p, a, b) ¿Está p estrictamente entre a y b en el segmento?
pointAboveOrOnLine(p, left, right) Test de semiplano con tolerancia.

Fill (final)

Par de booleanos (above, below) que indica si el espacio a cada lado de un segmento está dentro del polígono.

EventList / StatusList (final)

Estructuras de datos basadas en Skip List (trait SkipListCore). EventList mantiene la cola de eventos de barrido ordenada; StatusList mantiene el estado activo de segmentos durante el barrido.

GJTools (final)

Utilidades para importar y normalizar GeoJSON:

Método Descripción
geojsonToArray($source) Acepta string JSON, ruta de archivo, array o stdClass. Devuelve array de polígonos en formato [[[x,y],...],...].
compareCoordinates($a, $b, &$diff) Compara dos arrays de coordenadas punto a punto con tolerancia.
canonicalizePolygons($polys, $precision) Normaliza polígonos (rotación al mínimo lexicográfico, redondeo).
classifyRings($rings) Detecta relaciones interior/exterior entre anillos.
buildPolygons($nodes, $enforceOrientation) Construye la estructura final respetando orientación CCW/CW.

Flujo de procesamiento

Operación binaria típica

Barrido de línea (Intersecter)

El núcleo del algoritmo es un barrido de línea (sweep line) de izquierda a derecha:

  1. Se crean eventos START y END para cada extremo de segmento.
  2. Los eventos se procesan en orden lexicográfico (x, luego y) desde EventList.
  3. Al procesar un START: se buscan vecinos en StatusList y se calculan intersecciones con el segmento de arriba y de abajo. Si hay intersección, se divide el segmento afectado.
  4. Al procesar un END: se eliminan de StatusList y se emite el segmento con su Fill calculado.

Ensamblado de anillos (segmentChainer)

Usa un índice hash head → id y tail → id para encadenar segmentos en O(1) por inserción. Incluye simplificación colineal en los puntos de empalme para eliminar vértices redundantes.


API pública

Operaciones binarias

Operaciones n-arias

API de bajo nivel (para pipelines manuales)

Importación GeoJSON

Construcción manual de polígonos


Ejemplos de uso

Ejemplo 1: Unión de dos rectángulos

Ejemplo 2: Diferencia (recorte)

Ejemplo 3: Unión de múltiples polígonos

Ejemplo 4: Desde GeoJSON

Ejemplo 5: Pipeline manual (máximo control)


Optimizaciones implementadas

1. Skip List para EventList y StatusList

En lugar de listas enlazadas simples (O(n) por búsqueda), se usa una Skip List con altura aleatoria hasta 32 niveles. Esto reduce búsquedas e inserciones a O(log n) amortizado, crítico en el barrido de línea donde estas operaciones son el cuello de botella.

2. Índices hash para segmentChainer

El ensamblado de anillos usa tablas hash ($headIndex, $tailIndex) indexadas por clave de punto cuantizada. El coste de buscar si un punto ya existe en alguna cadena es O(1) en lugar de O(n).

3. Bounding box cacheada en Segment

Cada Segment precalcula y almacena minX, maxX, minY, maxY y len2 al crearse (y al recalcularse tras división). El rechazo temprano por AABB en checkIntersection evita calcular la intersección algebraica entre la gran mayoría de pares de segmentos no solapantes.

4. Bounds de PolySegments y cortocircuito geométrico

PolySegments almacena el bounding box del conjunto de segmentos. Las operaciones unionSegments, intersectSegments, xorSegments y differenceSegments comprueban primero si los bounds se solapan:

5. Reducción balanceada para unionMany

reduceBalanced combina los polígonos en un árbol binario en lugar de linealmente, reduciendo el número de operaciones de O(n) a O(log n) niveles de combinación, con mejor comportamiento de memoria.

6. Ordenación por posición antes de la reducción

Antes de la reducción, los segmentos se ordenan por la coordenada X mínima de su bounding box. Esto tiende a emparejar polígonos espacialmente cercanos primero, maximizando los cortocircuitos geométricos del punto 4.

7. Simplificación colineal en el ensamblado

Al encadenar segmentos, appendChainIdx y el caso de extensión en segmentChainer eliminan vértices intermedios cuando tres puntos consecutivos son colineales. Esto reduce el número de vértices del resultado sin pérdida de precisión.

8. Cuantización de puntos para las claves hash

pointKey() cuantiza las coordenadas multiplicando por 1/TOLERANCE y redondeando. Así, dos puntos dentro de la tolerancia producen la misma clave, evitando cadenas huérfanas por errores de punto flotante.

9. Back-pointer snode en Node

Cada Node de evento guarda una referencia directa al SkipNode que lo contiene. El borrado de un evento es O(altura del nodo) sin necesidad de buscar, evitando cierres (closures) por nodo y reduciendo presión sobre el GC.

10. Splitting de anillos auto-tocados

splitSelfTouchingRegions detecta y divide anillos que se auto-intersectan en un punto (figura en "8"), garantizando que el polígono final solo contenga ciclos simples válidos.


Mejoras sugeridas

Las mejoras detalladas, con propuestas de implementación, se encuentran en el documento IMPROVEMENTS.md.

Resumen

# Mejora Impacto Complejidad
1 Cache de pointKey en Point Rendimiento (CPU) Baja
2 Parámetro $precision ignorado en ringKey / polygonKey Corrección de bug Baja
3 removeColinearPointsFromPolygon no usa tolerancia correcta Corrección numérica Baja
4 __splitRegionAtDuplicates es O(n²) recursivo; puede ser O(n) Rendimiento Media
5 Método público combine() sin tipo de retorno declarado Calidad de código Muy baja
6 __operate usa CombinedPolySegments innecesariamente Simplificación Baja
7 intersectionMany, differenceMany, xorMany ausentes Funcionalidad Media
8 GJTools::buildGeometryFromCoordinates llama a json_decode sobre un array Bug potencial Baja

Profiling

Testing

Some tests inside tests.php, extended coverage with PHPUnit:

Tutorials and notes

Resources

History


All versions of martinez-rueda-php with dependencies

PHP Build Version
Package Version
No informations.
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package ifsnop/martinez-rueda-php contains the following files

Loading the files please wait ...